【问题标题】:Impala equivalent to regexp_substrImpala 等价于 regexp_substr
【发布时间】:2022-01-12 17:52:06
【问题描述】:

我有一个需要转换为 Impala 的 Oracle 查询。我知道 Impala 有 regexp_extract 根据我提供的正则表达式返回字符串。我担心的是,如果同一个字符串不止一次出现,我该如何捕捉呢?

假设我拥有的虚拟 Oracle 代码: Select t1.r1, REGEXP_SUBSTR("RMG123/RMG987",'(RMG\d{3})+',1,1) as r2, REGEXP_SUBSTR("RMG123/RMG987",'(RMG\d{3})+',1,2) as r3 From t1;

这里我将r2和r3的值分别作为RMG123和RMG987。

当我将其转换为 Impala 等效项时 Select t1.r1, regexp_extract("RMG123/RMG987",'(RMG\\d{3})+',1) as r2, regexp_extract("RMG123/RMG987",'(RMG\\d{3})+',2) as r3 From t1;

我得到 r2 的值为 RMG123,但没有得到 r3 的任何值,因为 regexp_extract 不允许检查模式的第二次出现。

请注意,数据 RMG123/RMH987 只是一个示例数据。用户不知道这两个字段是用/分隔的。

请在 Impala 中提出一种方法,我可以在其中获得与 Oracle 相同的结果。

【问题讨论】:

    标签: sql oracle impala regexp-substr


    【解决方案1】:

    在 Impala regexp_extract 中,最后一个参数是模式中的 group () 编号,而不是 Oracle regexp_substr 中的第 n 个出现次数。您的模式包含单个组号 1,没有组 2。如果您想提取第二次出现的子字符串,请更改模式,例如:

    regexp_extract("RMG123/RMG987",'(RMG\d{3})+.*?(RMG\d{3})',2)

    模式'(RMG\\d{3})+.*?(RMG\\d{3})'表示:

    (RMG\\d{3})+ - 第一组 1 次以上。 + 这里表示连续出现两个或多个模式将被视为单个。

    .*? - 一些分隔符在任何时候都是非贪婪的

    (RMG\\d{3}) - 第二组 - 这是您要提取的模式的第二次出现。

    + 模式中第一组之后的符号在这里很重要,因为没有它,没有任何分隔符的组的多次出现将被视为新出现,带 + 符号,多次出现将被视为单个出现。

    例如,如果初始字符串是RMG123RMG980/RMG987

    regexp_extract("RMG123RMG980/RMG987",'(RMG\\d{3})+.*?(RMG\\d{3})',2)
    

    将产生RMG987

    和没有+的相同模式

     regexp_extract("RMG123RMG980/RMG987",'(RMG\\d{3}).*?(RMG\\d{3})',2)
    

    将产生RMG980

    不幸的是我没有 Impala 来测试它,在 Hive 中同样的工作,Impala 正则表达式的风格可能有点不同。

    【讨论】:

    • 我对此进行了测试,它确实有效。关于 regexp_extract() 的组概念的很好的解释。我现在明白了。
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2023-04-11
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多