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 之间的正则表达式的语法是不是不同?的主要内容,如果未能解决你的问题,请参考以下文章
Impala 或 Hive 在其他 SQL 语法中是不是有类似 IN 子句的东西?