Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在配置单元中构建正则表达式以在第n次出现分隔符之前获取字符串_Regex_Hive_Hiveql - Fatal编程技术网

Regex 如何在配置单元中构建正则表达式以在第n次出现分隔符之前获取字符串

Regex 如何在配置单元中构建正则表达式以在第n次出现分隔符之前获取字符串,regex,hive,hiveql,Regex,Hive,Hiveql,我在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 regexp_replace(`data`, '^([^:]+:[^:]+

我在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 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
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}}量词。如果有带变量:

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}}量词。如果有使用split和posexplode函数,您可以再次与过滤位置组合

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

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

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

您可以使用类似于select splitstr':'[3]的内容,我认为这将给出数组的第四个元素,而不是我所关心的整个字符串。您可以使用类似于select splitstr':'[3]从表中,我认为这将给出数组的第4个元素,而不是我所关心的整个字符串。您介意用代码提供一点解释吗?当然,正则表达式使用capture group来过滤第一个被删除的N3冒号,除此之外的其他文本将被删除。我的意思是,您是否可以只更新您的代码答案,以便为其他人的利益提供一些解释。您介意为您的代码提供一些解释吗?当然,正则表达式使用捕获组来过滤第一个被删除的N3冒号,除此之外的其他文本都被删除了,我的意思是你可以更新你的代码,只回答为其他人的利益提供一些解释。欢迎使用堆栈溢出。虽然这段代码可能是这个问题的解决方案,但最好包括对它的作用以及如何解决问题的解释,以便将来的访问者可以从中学习。欢迎使用Stack Overflow。虽然这段代码可能是问题的解决方案,但最好是解释它的作用以及如何解决问题,以便将来的访问者可以从中学习。