在 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 中使用字符串或数组检查子集的主要内容,如果未能解决你的问题,请参考以下文章
通过 Hive 或 Impala 或 Pig 中的字符串匹配连接表