首页 > 解决方案 > 在 Impala 中使用字符串或数组检查子集

问题描述

我有一张这样的桌子

 col
-----
 A,B

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

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

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

A,D,B--> TRUE(介于两者之间的其他项目)

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

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

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

谢谢

标签: sqlhadoophivebigdataimpala

解决方案


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

假设一个表有一个唯一标识符 columnid和一个array<string>column col,以及一个带有','分隔符的字符串变量(并且没有出现 escaped '\,' ......

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'}.

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


推荐阅读