Hive验证数组列所有元素是否包含指定字符串的实现方法
验证Hive表中codeset列所有元素是否包含对应code值的简便方法
嘿,这个需求其实用Hive的内置函数组合一下就能轻松搞定,不用写复杂的逻辑~
核心解决方案(适用于Hive 2.3.0及以上版本)
直接利用split、transform和all函数的组合来实现:
SELECT code, codeset, all(transform(split(codeset, ','), x -> instr(x, code) > 0)) AS is_all_contained FROM your_table;
代码解释
split(codeset, ','):把逗号分隔的codeset字符串拆分成数组,比如AB123,MU124会变成["AB123", "MU124"]。transform(..., x -> instr(x, code) > 0):遍历拆分后的数组,对每个元素x用instr函数判断是否包含code(instr返回子串在字符串中的位置,大于0表示存在),返回一个布尔值数组。all(...):检查布尔数组中的所有元素是否都是true,如果是则返回true,否则返回false——正好对应你需要的验证逻辑。
拿你的示例数据测试:
- 第一行:
transform后得到[true, false],all返回false - 第二行:
transform后得到[true, true],all返回true
兼容旧版本Hive的替代方案
如果你的Hive版本不支持all函数,可以用lateral view explode结合分组统计的方式:
SELECT code, codeset, SUM(CASE WHEN instr(x, code) > 0 THEN 1 ELSE 0 END) = SIZE(split(codeset, ',')) AS is_all_contained FROM your_table LATERAL VIEW EXPLODE(split(codeset, ',')) t AS x GROUP BY code, codeset;
这个方法是把每个元素拆出来后统计符合条件的数量,再和总元素数对比,相等就说明所有元素都包含code。
内容的提问来源于stack exchange,提问作者M. Uk
相关产品推荐
相关产品推荐

