HIVE SQL实现类似grep -Ff功能:检查字符串是否含指定列表元素
Hive SQL实现类似grep -Ff的匹配功能
要检查字符串是否包含指定代码列表中的任意元素,不用逐个列举的话,Hive里有两种实用方案:
方案一:用regexp_like拼接正则表达式
把需要匹配的代码列表拼成用|分隔的正则字符串,直接用regexp_like函数匹配。比如要匹配'a'或'b':
SELECT col, regexp_like(col, 'a|b') AS answer FROM your_table;
如果代码列表存在变量或表中,可以用concat_ws拼接成正则:
WITH codes AS ( SELECT collect_list(code) AS code_list FROM your_code_table ) SELECT t.col, regexp_like(t.col, concat_ws('|', c.code_list)) AS answer FROM your_table t CROSS JOIN codes c;
注意:如果代码里包含正则特殊字符(如
.、*),需要先转义,避免匹配出错。
方案二:用关联查询+LIKE判断
如果代码列表存在表中,用EXISTS或者分组聚合的方式判断,这种方法不用处理正则转义,更稳妥:
方法1:EXISTS子查询
SELECT d.col, CASE WHEN EXISTS (SELECT 1 FROM codes c WHERE d.col LIKE CONCAT('%', c.code, '%')) THEN 'true' ELSE 'false' END AS answer FROM diagnostics d;
方法2:CROSS JOIN+分组聚合
SELECT d.col, MAX(CASE WHEN d.col LIKE CONCAT('%', c.code, '%') THEN 1 ELSE 0 END) = 1 AS answer FROM diagnostics d CROSS JOIN codes c GROUP BY d.col;
如果代码列表不是表,是固定的字符串,可以用explode生成临时表:
WITH codes AS ( SELECT code FROM explode(split('a,b,c', ',')) code ) SELECT d.col, CASE WHEN EXISTS (SELECT 1 FROM codes c WHERE d.col LIKE CONCAT('%', c.code, '%')) THEN 'true' ELSE 'false' END AS answer FROM diagnostics d;
这两种方案里,方案一适合代码列表元素少、无特殊字符的场景;方案二更通用,尤其是代码列表动态变化的情况,性能也更稳定。
内容的提问来源于stack exchange,提问作者magooken
相关产品推荐
相关产品推荐

