我在hive表中有两列看起来像这样:
code codeset
AB AB123,MU124
LM LM123,LM234
我需要验证codeset列中的所有元素是否包含代码列中的值,因此在上面的示例中,第一行将为false,第二行将为true。
有一种简单的方法可以解决这个问题吗?我已经阅读过有关array_contains的内容,但如果只有一个元素匹配则返回true,我需要所有元素来包含代码列中的内容。
提前致谢。
答案 0 :(得分:0)
split
字符串explode
并使用lateral view
取消数据的转移。如果分割代码集包含每个代码(使用locate
和group 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