2014-11-06 41 views
4

我有一个由user_id和item_id(用户已购买的项目的id)组成的Hive表。 我想我写了简单的查询所有谁购买第1项而不是项目2和3阵列中的Hive检查元素

用户要做到这一点的列表:

SELECT user_id, collect_set(item_id) itemslist FROM mytable 
WHERE item_id in (1, 2) 
GROUP BY user_id 
HAVING -- what should I put here??? 

正如你所看到的,我不t知道如何检查数组itemslist是否包含1而不是2.

你是如何做到这一点的? 如果有一些更有效的方法可以请告诉我两个(或更多)的方法?

回答

11

Hive`中有一些集合函数(参见集合函数:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF),可以在这里使用。

您可以使用array_contains(Array<T>, value)函数来检查项目1是否存在,并使用size(Array<T>)函数确保长度为1.如果两个条件都满足,您将获得所需的输出。

+0

如果我想显示select语句中找到的项目,该怎么办? – 2016-12-27 23:03:45

+0

array_contains不适用于正则表达式模式。例如,如果我想检查数组中是否有任何具有子字符串foo。*的项目。你有什么建议吗? – 2018-02-15 00:11:41