2014-11-06 3 views
4

У меня есть таблица Hive, сделанная из user_id и item_id (идентификатор предметов, которые были приобретены пользователем). Я хочу, чтобы получить список всех пользователей, которые приобрели пункт 1, но не пункт 2 и 3.Элементы проверки верности в массиве

Чтобы сделать это, я написал простой запрос:

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 знать, как проверить, содержит ли список элементов массива 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, как бы я это сделал? –

+0

array_contains не работает с шаблоном регулярного выражения. Например, если я хочу проверить, есть ли какой-либо элемент в массиве с подстрокой foo. *. Есть ли у вас предложения? –

Смежные вопросы