在Impala

时间:2018-05-23 08:27:25

标签: sql hadoop hive bigdata impala

我有一张这样的表

 col
-----
 A,B

col可以是逗号或数组的字符串。我对存储有灵活性。

如何检查col是另一个字符串或数组变量的子集?例如:

B,A - > TRUE(顺序无关紧要)

A,D,B - > TRUE(中间的其他项目)

A,D,C - > FALSE(缺少B

我对这种类型有灵活性。变量是我无法存储在表格中的东西。

如果您对Impala有任何建议(没有Hive),请告诉我。

由于

1 个答案:

答案 0 :(得分:1)

一个不太漂亮的方法,但也许是一个起点...

假设一个表具有唯一标识符列idarray<string>col,以及一个字符串变量','作为分隔符(并且没有出现)转义'\,' ...

SELECT
  yourTable.id
FROM
  yourTable,
  yourTable.col
GROUP BY
  yourTable.id
HAVING
  COUNT(DISTINCT CASE WHEN find_in_set(col.item, ${VAR:yourString}) > 0 THEN col.item END)
  =
  LENGTH(regexp_replace(${VAR:yourString},'[^,]',''))+1

基本上...

  • 展开表格中的数组,每个数组项目一行。
  • 检查字符串中是否存在每个项目。
  • 重新聚合以计算字符串中找到的项目数。
  • 检查找到的项目数是否与字符串
  • 中的项目数相同

COUNT(DISTINCT <CASE>)可以应对{'a', 'a', 'b', 'b'}等数组。

不将字符串扩展为数组或表(我不知道该怎么做),你依赖于字符串中唯一的项目。 (因为我只是在字符串中计算逗号以找出有多少项...)