Элементы проверки верности в массиве
У меня есть таблица 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???
Как вы можете видеть, я не знаю, как проверить, содержит ли список элементов массива 1, а не 2.
Как вы это делаете?
Если есть более эффективный способ, можете ли вы рассказать мне обоим (или более) методам?
Ответы
Ответ 1
В Hive есть несколько функций сбора (см. функции сбора здесь: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF), которые можно использовать здесь.
Вы можете использовать функцию array_contains(Array<T>, value)
, чтобы проверить наличие элемента 1, и функцию size(Array<T>)
, чтобы убедиться, что длина равна 1. Если оба условия выполнены, вы получите желаемый результат.