首页 > 解决方案 > Hive REGEXP_EXTRACT 返回空结果

问题描述

我正在尝试从下面的示例数据中提取 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

标签: regexhiveextract

解决方案


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 位数字,但前提是它们前面有一个 _”。它使用 _ 进行匹配,但不将其视为提取匹配的一部分。


推荐阅读