Hive正则匹配异常求助:LIKE/Rlike语法失效排查
问题原因拆解
这个问题我之前也碰到过,核心是没搞清楚Hive里like和rlike的语法差异,咱们一步步说清楚:
1. like不支持正则方括号语法
Hive的like是简单通配符匹配,只认两个特殊符号:
%:匹配任意长度的任意字符(包括空字符串)_:匹配单个任意字符
你写的like '[A-Z]%',Hive会把[A-Z]当成普通的字面量字符串去匹配——也就是找主键以[A-Z]这5个字符开头的行,而不是以A到Z大写字母开头的行,自然查不到结果。同理,like '[F]%'是找以[F]开头的主键,当然也匹配不到你的数据。
2. rlike的正则语法用错了
rlike是支持正则表达式的,但你写的rlike 'F%'犯了个正则基础错误:正则里的%不是通配符,而是量词(表示前面的字符重复0次或多次)。所以这个正则的意思是匹配"F"后面跟着0个或多个"F"的字符串(比如"F"、"FF"、"FFF"),而你的数据是F开头后面有其他字符,自然匹配不到。
解决办法
根据你的需求,给你几个可行的方案:
方案1:用rlike写正确的正则表达式
要匹配以A-Z大写字母开头的行,正确的正则应该是^[A-Z].*,其中:
^:锚定字符串的开头[A-Z]:匹配任意一个大写字母.*:匹配任意长度的任意字符(对应like里的%)
执行语句:
SELECT * FROM my_table WHERE pk RLIKE '^[A-Z].*' LIMIT 5;
如果只是要匹配以F开头的行,用RLIKE '^F.*'也可以,但这种场景下like 'F%'性能更好,因为like能利用前缀匹配的优化。
方案2:用regexp_extract函数辅助判断
也可以通过提取主键的第一个字符来筛选,比如:
SELECT * FROM my_table WHERE regexp_extract(pk, '^([A-Z])', 1) != '' LIMIT 5;
这个函数会提取主键开头符合[A-Z]的字符,如果提取结果非空,就说明符合条件。
方案3:Hive 3.0+ 可用like regexp语法
如果你用的是Hive 3.0及以上版本,可以开启hive.support.quoted.identifiers=none配置后,使用like regexp语法:
SELECT * FROM my_table WHERE pk LIKE REGEXP '^[A-Z].*' LIMIT 5;
不过这个语法不如直接用rlike直观,个人更推荐方案1。
内容的提问来源于stack exchange,提问作者alexvas
相关产品推荐
相关产品推荐

