首页 > 解决方案 > Impala Regex 前瞻和后视的解决方法

问题描述

如果我使用 Hive,则以下工作正常。但是如果我使用 Impala,它会抛出错误:

select regexp_replace("foobarbarfoo","bar(?=bar)","<NA>");

WARNINGS: Could not compile regexp pattern: bar(?=bar)
Error: invalid perl operator: (?=

基本上,Impala 不支持lookahead 和lookbehind

https://www.cloudera.com/documentation/enterprise/release-notes/topics/impala_incompatible_changes.html#incompatible_changes_200

今天有解决方法吗?也许使用UDF?

谢谢。

标签: sqlregexhiveimpala

解决方案


由于您正在使用regexp_replace,匹配并捕获您想要保留的字符串部分(但想要用作必须具有的上下文)并替换为反向引用。请参阅regexp_replaceImpala 参考

这些示例展示了如何使用替换文本替换与模式匹配的部分字符串,其中可以包括()对模式字符串中任何组的反向引用。反向引用编号从 1 开始,任何\字符都必须转义为\\.

所以,在这里,你可以使用

select regexp_replace("foobarbarfoo","bar(bar)","<NA>\\1");
                                         ^   ^       ^^^   

请注意,它不能替换连续的匹配项,但是,它将在当前场景中工作并且foobarbarfoo会变成foo<NA>barfoo(请注意,Go 正则表达式引擎也是 RE2,因此在 regex101.com 上选择了此选项)。


推荐阅读