蜂巢:没有横向视图的带有数组的联接表爆炸

时间:2019-03-20 10:03:45

标签: hive

我已经搜索了在蜂巢上使用数组列联接表的方法,但是所有答案都建议使用LATERAL view EXPLODE。

我想获取如下数据;

+---------+----------+----------+
|  name   | type_id  | spend_sum|
+---------+----------+----------+
| john    |  9       |   100    | 
+---------+----------+----------+
| ben     |  9       |   350    |
+---------+----------+----------+
| ben     |  8       |   350    |
+---------+----------+----------+

从下面2个表格中获取

表1

+----------+---------------+-----------------+---------+----------+
| 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      |
+----------+---------------+-----------------+---------+----------+

表2

+---------+------------------+---------------+
|  value  | item_id(bigint)  |  type_id(int) |
+---------+------------------+---------------+
| 1       |  11              |    9          | 
+---------+------------------+---------------+
| 2       |  12              |    8          |
+---------+------------------+---------------+
| 3       |  13              |    9          |
+---------+------------------+---------------+

请帮助我。

1 个答案:

答案 0 :(得分:0)

您可以使用array_contains(Array<T>, value)进行加入,但是在Hive中,不允许使用非均等加入。因此,您可以进行交叉联接(或在没有ON条件的情况下进行联接,这是相同的),并使用

过滤乘以CROSS JOIN的行

WHERE array_contains(t1.value, t2.value)

array_contains()是一个布尔函数,因此您可以在WHERE子句中使用它,而无需附加条件。

但是根据表的大小,对爆炸值使用explode + join的解决方案可能会更好,因为交叉联接会将一个表的所有行乘以第二个表的所有行。