Hive 和 Impala 之间的正则表达式的语法是不是不同?

Posted

技术标签:

【中文标题】Hive 和 Impala 之间的正则表达式的语法是不是不同?【英文标题】:Is the syntax for a regular expression different between Hive and Impala?Hive 和 Impala 之间的正则表达式的语法是否不同? 【发布时间】:2018-12-19 16:33:20 【问题描述】:

以下 regexp_extract 函数在 Impala 中似乎可以工作,但在 Hive 中使用时不起作用:

select regexp_extract("efwe FR wefwef", '.*?([[:upper:]]+).*?', 1)

Impala 中的结果是 FR(正如我所料,即第一组中的大写字符)

Hive 中的结果是 e(不是我所期望的)

谁能解释这是为什么?

通过研究这个问题,我了解到将正则表达式转换为 java 风格的正则表达式可能会有所帮助 (http://www.regexplanet.com/advanced/java/index.html)。但据我所知,Java Style Regex 与我所拥有的相同。

【问题讨论】:

Impala 似乎使用 RE2,而 Java 正则表达式则完全不同。在 Hive 中使用 '.*?(\\pLu+).*' 【参考方案1】:

我自己发现了答案。 Java 不支持 POSIX 括号表达式,所以我使用 A-Z 而不是 :upper:

https://www.cloudera.com/documentation/enterprise/5-9-x/topics/impala_string_functions.html 在 Impala 2.0 及更高版本中,Impala 正则表达式语法符合 Google RE2 库使用的 POSIX 扩展正则表达式语法。有关详细信息,请参阅 RE2 文档。

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select#LanguageManualSelect-REGEXColumnSpecification 我们使用 Java 正则表达式语法。尝试http://www.fileformat.info/tool/regex.htm 进行测试。

【讨论】:

以上是关于Hive 和 Impala 之间的正则表达式的语法是不是不同?的主要内容,如果未能解决你的问题,请参考以下文章

Hive正则表达式

Hive 和 Impala 之间的时间戳

Impala 或 Hive 在其他 SQL 语法中是不是有类似 IN 子句的东西?

HIVE/Impala 查询:计算满足特定条件的行之间的行数

Hive中常用正则表达式的运用

Impala Regex:匹配字符 a 和 b 之间的字符串(如果 b 存在)