如何在 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 标记的文本 [重复]