Hive: объединение таблиц с массивом без расширения БОКОВОГО ОБЗОРА

#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 без дополнительных условий.

Но в зависимости от размера ваших таблиц решение с разнесением объединением для разнесенных значений может работать лучше, потому что перекрестное объединение умножает все строки из одной таблицы на все строки из второй.