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

Posted

技术标签:

【中文标题】在 Impala 中使用字符串或数组检查子集【英文标题】:Check subset using either string or array in Impala 【发布时间】:2018-05-23 08:27:24 【问题描述】:

我有一张这样的桌子

 col
-----
 A,B

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

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

B,A --> TRUE(顺序无所谓)

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

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

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

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

谢谢

【问题讨论】:

永远不要考虑将数据集存储为逗号分隔的列表。规范化结构,或按照您的建议使用数组。但是在任何数据库中使用逗号分隔的字符串都应该受到 monty-python 的惩罚...... @MatBailie 这是企业设计,其中 LDAP 信息存储在列中。如果需要,我可以把它做成一个单独的表。但我无法控制变量组件,因为它再次来自 LDAP,被“实时”引入(未作为缓存保存在表中)。 我现在无法访问 Impala。如何选择数组变量的每一行?例如SELECT * FROM yourTable, YourTable.col 会将数组列扩展为新行。使用变量执行此操作的语法是什么? (完成后,我可以向您展示标准 SQL 方法。) 不变量是固定字符串,不是来自另一个表。 变量不能是数组? 【参考方案1】:

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

假设一个表具有唯一标识符列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

基本上...

将表中的数组扩展为每个数组项一行。 检查每个项目是否存在于您的字符串中。 汇总备份以计算在字符串中找到了多少项。 检查找到的项目数是否与字符串中的项目数相同

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

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

【讨论】:

这个很有创意。谢谢!

以上是关于在 Impala 中使用字符串或数组检查子集的主要内容,如果未能解决你的问题,请参考以下文章

将其他类型转换为 Impala 数组

Impala 日期到字符串的转换

hive 或 impala 函数来获取字符串的子字符串

通过 Hive 或 Impala 或 Pig 中的字符串匹配连接表

如何优化 Impala 查询以将 LIKE 与 IN 结合(字面意思或有效)?

Hive/Impala 列评论在几个字符后被截断