gpt4 book ai didi

regex - hive regexp_extract 奇怪之处

转载 作者:行者123 更新时间:2023-12-04 01:24:06 25 4
gpt4 key购买 nike

我在使用 regexp_extract 时遇到了一些问题:

我正在查询一个制表符分隔的文件,我正在检查的列有如下所示的字符串:

abc.def.ghi

现在,如果我这样做:
select distinct regexp_extract(name, '[^.]+', 0) from dummy;

MR 作业运行,它工作,我从索引 0 得到“abc”。

但是现在,如果我想从索引 1 中获得“def”:
select distinct regexp_extract(name, '[^.]+', 1) from dummy;

Hive 失败:
2011-12-13 23:17:08,132 Stage-1 map = 0%,  reduce = 0%
2011-12-13 23:17:28,265 Stage-1 map = 100%, reduce = 100%
Ended Job = job_201112071152_0071 with errors
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask

日志文件说:
java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row

我在这里做错了什么吗?

谢谢,
马里奥

最佳答案

来自文档 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF看起来 regexp_extract() 是您希望提取的数据的记录/行提取。

它似乎适用于第一个发现(然后退出)而不是全局。因此索引引用捕获组。

0 = 整个比赛
1 = 捕获组 1
2 = 捕获组 2,等等...

从手册中转述:

regexp_extract('foothebar', 'foo(.*?)(bar)', 2)
^ ^
groups 1 2

This returns 'bar'.

因此,在您的情况下,要获取点后的文本,这样的操作可能有效: regexp_extract(name, '\.([^.]+)', 1)或者这个 regexp_extract(name, '[.]([^.]+)', 1)
编辑

我对这个重新感兴趣,仅供引用,可能有适合您的快捷方式/解决方法。

看起来你想要一个用点分隔的特定段 .字符,这几乎就像 split 。
如果它被量化不止一次,那么使用的正则表达式引擎很可能会覆盖一个组。
您可以通过以下方式利用它:

返回第一段: abc .def.ghi regexp_extract(name, '^(?:([^.]+)\.?){1}', 1)
返回第二段:abc。 def .ghi regexp_extract(name, '^(?:([^.]+)\.?){2}', 1)
返回第三段:abc.def。 ghi regexp_extract(name, '^(?:([^.]+)\.?){3}', 1)
索引不会改变(因为索引仍然指向捕获组 1),只有正则表达式重复发生了变化。

一些注意事项:
  • 这个正则表达式 ^(?:([^.]+)\.?){n}虽然有问题。
    它要求段中的点之间有一些东西,否则正则表达式将不匹配 ... .
  • 可能是这个 ^(?:([^.]*)\.?){n}但即使少于 n-1 个点,这也会匹配,
    包括空字符串。这可能是不可取的。

  • 有一种方法可以做到在点之间不需要文本,但仍然需要至少 n-1 个点。
    这使用先行断言和捕获缓冲区 2 作为标志。
    ^(?:(?!\2)([^.]*)(?:\.|$())){2} ,其他都一样。

    所以,如果它使用 java 风格的正则表达式,那么这应该可以工作。 regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){2}', 1)将 {2} 更改为需要的任何“段”(这是段 2)。

    并且在第 {N} 次迭代后它仍然返回捕获缓冲区 1。

    这里分解了
    ^                # Begining of string
    (?: # Grouping
    (?!\2) # Assertion: Capture buffer 2 is UNDEFINED
    ( [^.]*) # Capture buffer 1, optional non-dot chars, many times
    (?: # Grouping
    \. # Dot character
    | # or,
    $ () # End of string, set capture buffer 2 DEFINED (prevents recursion when end of string)
    ) # End grouping
    ){3} # End grouping, repeat group exactly 3 (or N) times (overwrites capture buffer 1 each time)

    如果它不做断言,那么这将不起作用!

    关于regex - hive regexp_extract 奇怪之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8497090/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com