检查hive数组中的所有元素是否包含字符串模式

时间:2018-04-04 19:58:16

标签: hive hiveql

我在hive表中有两列看起来像这样:

code    codeset
AB      AB123,MU124
LM      LM123,LM234

我需要验证codeset列中的所有元素是否包含代码列中的值,因此在上面的示例中,第一行将为false,第二行将为true。

有一种简单的方法可以解决这个问题吗?我已经阅读过有关array_contains的内容,但如果只有一个元素匹配则返回true,我需要所有元素来包含代码列中的内容。

提前致谢。

2 个答案:

答案 0 :(得分:0)

split字符串explode并使用lateral view取消数据的转移。如果分割代码集包含每个代码(使用locategroup by完成),请使用having进行检查。

select code,codeset
from tbl
lateral view explode(split(codeset,',')) t as split_codeset
group by code,codeset
having sum(cast(locate(code,split_codeset)>0 as int))=count(*)

答案 1 :(得分:0)

select a.pattern,b.listOfInputs from ( select * from (select a.pattern, case when inputCount = sumPatternMatchResult then true else false end finalResult from (select pattern , sum(patternMatchResult) as sumPatternMatchResult from (select pattern,case when locate(pattern,input) !=0 then 1 else 0 end patternMatchResult from (select pattern,explode(split(listOfInputs,',')) as input from tbl)a ) b group by pattern) a join (select pattern , count(input) inputCount from (select pattern,explode(split(listOfInputs,',')) as input from tbl)a group by pattern) b on a.pattern=b.pattern )c where finalResult=true)a join (select * from tbl) b on a.pattern=b.pattern

这也可以。

表的列映射详细信息:

代码->模式

代码集-> listOfInputs