如何在 Hive 中构建正则表达式以获取字符串,直到第 N 次出现分隔符

Posted

技术标签:

【中文标题】如何在 Hive 中构建正则表达式以获取字符串,直到第 N 次出现分隔符【英文标题】:How to build a regex in Hive to get string until Nth occurrence of a delimiter 【发布时间】:2020-01-17 07:24:40 【问题描述】:

我在 Hive 中有一些示例数据

select "abc:def:ghi:jkl" as data
union all
select "jkl:mno:23ar:stu:abc:def:ghi:7345" as data

我想提取字符串直到第三个冒号,以便我得到输出为

abc:def:ghi
jkl:mno:23ar

我想保持 N 作为变量,以便我可以根据需要缩小输出文本。如何在 Hive 中执行此操作?

【问题讨论】:

你可以使用类似 select split(str,':')[3] from table 我认为这将给出数组的第四个元素,而不是我关心的整个字符串 【参考方案1】:
SELECT regexp_replace(`data`, '^([^:]+:[^:]+:[^:]+).*$', "$1")
FROM
  ( SELECT "abc:def:ghi:jkl" AS `data`
   UNION ALL SELECT "jkl:mno:23ar:stu:abc:def:ghi:7345" AS `data`) AS tmp

【讨论】:

您介意对您的代码进行一些解释吗? 当然,正则表达式使用捕获组过滤第一个N(3)个冒号分隔的,除此之外的其他文本被丢弃 我的意思是您能否更新您的纯代码答案,以便为他人的利益提供一些解释。【参考方案2】:

使用 split 和poseexplode 函数,您可以再次与过滤位置组合

select t.dataId, concat_ws(":", collect_list(t.cell)) as firstN from (
SELECT x.dataId, pos as pos, cell
   FROM  (
     select 1 as dataId, "jkl:mno:23ar:stu:abc:def:ghi:7345" as data
      union all
     select 2 as dataId, "abc:def:ghi:7345" as data
   ) x 
   LATERAL VIEW posexplode(split(x.data,':')) dataTable AS pos, cell
) t
where t.pos<3
group by t.dataId

【讨论】:

【参考方案3】:

带变量:

set hivevar:n=3; --variable, you can pass it to the script

with your_table as(
select stack(2,"abc:def:ghi:jkl", "jkl:mno:23ar:stu:abc:def:ghi:7345")as data
)

select regexp_replace(regexp_extract(data,'([^:]*:)1,$hivevar:n',0),':$','') from your_table;

结果:

OK
abc:def:ghi
jkl:mno:23ar
Time taken: 0.105 seconds, Fetched: 2 row(s)

变量替换后的量词1,$hivevar:n会变成1,3,这意味着1到3次,这允许提取小于3的值。如果不需要提取更短的值,请使用$hivevar:n量词。如果有

【讨论】:

【参考方案4】:
Select substring_index('abc:def:ghi:jkl',':',3) as data
Union all
Select substring_index('jkl:mno:23ar:stu:abc:def:ghi:7345',':',3) as data;

【讨论】:

欢迎来到 Stack Overflow。虽然此代码可能是问题的解决方案,但最好包含对它的作用以及它如何解决问题的解释,以便未来的访问者可以从中学习。

以上是关于如何在 Hive 中构建正则表达式以获取字符串,直到第 N 次出现分隔符的主要内容,如果未能解决你的问题,请参考以下文章

构建正则表达式(RegEx)以提取 HTML 标记的文本 [重复]

如何在 Hive 中使用正则表达式来解析 Apache 日志时间戳?

如何使用正则表达式拆分字符串以返回值列表?

如何在配置单元中使用正则表达式排除字符串中的特殊字符

Hive中常用正则表达式的运用

在 Hive 中使用字符串比较和正则表达式时的不同结果