【问题标题】:Hive REGEXP_EXTRACT returning null resultsHive REGEXP_EXTRACT 返回空结果
【发布时间】:2018-05-31 21:39:38
【问题描述】:

我正在尝试从下面的示例数据中提取 R7080075 和 X1234567。格式始终为单个大写字符后跟 7 位数字。此 ID 也始终以下划线开头。由于它是用户生成的数据,因此有时它是记录中的第一个下划线,有时前面的所有空格都已替换为下划线。

我在 select 语句中用这个查询 HDP Hive:

REGEXP_EXTRACT(column_name,'[(?:(^_A-Z))](\d{7})',0) 

我已经尝试寻址位置 0-2 并且没有返回错误或任何数据。我在 regextester.com 上测试了代码,它突出显示了我要提取的数据。然后当我在 Zepplin 中运行它时,它返回 NULL。

我的正则表达式经验有限,因此我已在此处查看有关 regexp_extract (+hive) 的文章并与一位同事交谈。提前感谢您的帮助。

样本数据:

Sept Wk 5 Sunny Sailing_R7080075_12345
Holiday_Wk2_Smiles_X1234567_ABC

【问题讨论】:

    标签: regex hive extract


    【解决方案1】:

    Hive 手册是这样说的:

    请注意,在使用预定义的字符类时需要注意:使用 '\s' 作为第二个参数将匹配字母 s; '\\s' 是匹配空格等所必需的。

    此外,您的表达式在字符类中包含不必要的字符。

    试试这个:

    REGEXP_EXTRACT(column_name,'_[A-Z](\\d{7})',0) 
    

    由于您只想要不带下划线的部分,因此请使用:

    REGEXP_EXTRACT(column_name,'_([A-Z]\\d{7})',1)
    

    它匹配整个模式,但只提取第二组而不是整个匹配。

    或者:

    REGEXP_EXTRACT(column_name,'(?<=_)[A-Z]\\d{7}', 0)
    

    这使用了一种称为“正向回溯”的正则表达式技术。它翻译为:“给我找一个大写字母后跟 7 位数字,但仅如果它们前面有一个 _”。它使用 _ 进行匹配,但不将其视为提取匹配的一部分。

    【讨论】:

    • 谢谢,瓦桑。这让我大部分时间都在那里。一些额外语法的原因是我想通过使用前导下划线来识别它,但我不想返回下划线。另外,我不能指望它是字符串中唯一的[A-Z](\\d{7})。最后,'[(^_A-Z)](\\d{7})' 给了我我需要的东西。感谢您对双反斜杠参考的帮助!
    • @LeighF。但这仍然是不正确的语法 - 您在 [] 中包含的任何内容都将被逐字解释并失去其特殊的正则表达式含义。此外,它们被视为被“OR”分隔。因此,您的表达式转换为“匹配单个 ^ 或 _ 或 ( 或 ) 或大写字母,然后匹配 7 位数字”。也许它仍然适用,但请注意这一点。
    • 感谢您提供更多详细信息。虽然它有效,但我发现它可能并非总是如此。我想匹配_[A-Z]####### 但只返回[A-Z]####### 我发现[A-Z](\\d{7}) 这样做,但只是因为[A-Z] 匹配,而不是因为它也根据前面_ 的条件匹配。您的示例还返回下划线。有没有办法在匹配中包含下划线而不是提取?
    • @LeighF。我用你需要的东西编辑了我的答案。请试试这个并告诉我。
    • 谢谢@Vasan。选项二效果很好! REGEXP_EXTRACT(column_name,'_([A-Z]\\d{7})',1)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多