在 Impala 中使用字符串或数组检查子集

Check subset using either string or array in Impala

我有一个table这样的

 col
-----
 A,B

col可以是带逗号的字符串,也可以是数组。我在存储方面有灵活性。

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

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

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

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

我在类型上有灵活性。该变量是我无法存储在 table.

中的东西

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

谢谢

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

假设一个 table 具有唯一标识符列 id 和一个 array<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

基本上...

  • 将 table 中的数组扩展为每个数组项一行。
  • 检查字符串中是否存在每一项。
  • 重新聚合以计算在字符串中找到了多少项。
  • 检查找到的项目数是否与字符串中的项目数相同

COUNT(DISTINCT <CASE>) 处理像 {'a', 'a', 'b', 'b'} 这样的数组。

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