#sql #arrays #hive #hiveql
#sql #массивы #улей #hiveql
Вопрос:
Я искал способ объединения таблиц с помощью массива coumn в hive, но все ответы предполагают использовать РАЗНЕСЕНИЕ по БОКОВОМУ виду.
Я хочу получить данные, подобные приведенным ниже ;
--------- ---------- ----------
| name | type_id | spend_sum|
--------- ---------- ----------
| john | 9 | 100 |
--------- ---------- ----------
| ben | 9 | 350 |
--------- ---------- ----------
| ben | 8 | 350 |
--------- ---------- ----------
Из 2 таблиц ниже;
Table1
---------- --------------- ----------------- --------- ----------
| order_id | value(array) | item_id(array) | name | spend |
---------- --------------- ----------------- --------- ----------
| 1 | [1] | [11] | john | 100 |
---------- --------------- ----------------- --------- ----------
| 2 | [2,3] | [12,13] | ben | 200 |
---------- --------------- ----------------- --------- ----------
| 3 | [1,2] | [11,12] | ben | 150 |
---------- --------------- ----------------- --------- ----------
Table2
--------- ------------------ ---------------
| value | item_id(bigint) | type_id(int) |
--------- ------------------ ---------------
| 1 | 11 | 9 |
--------- ------------------ ---------------
| 2 | 12 | 8 |
--------- ------------------ ---------------
| 3 | 13 | 9 |
--------- ------------------ ---------------
Пожалуйста, помогите мне в этом.
Ответ №1:
Вы можете присоединиться, используя array_contains(Array<T>, value)
но в Hive объединения с неравенством не разрешены. Таким образом, вы можете выполнить перекрестное соединение (или присоединиться без условия ON, что одно и то же) и отфильтровать строки, умноженные на ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ, используя
WHERE array_contains(t1.value, t2.value)
array_contains()
это логическая функция, поэтому вы можете использовать ее в предложении WHERE без дополнительных условий.
Но в зависимости от размера ваших таблиц решение с разнесением объединением для разнесенных значений может работать лучше, потому что перекрестное объединение умножает все строки из одной таблицы на все строки из второй.