我已经搜索了在蜂巢上使用数组列联接表的方法,但是所有答案都建议使用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 |
+---------+------------------+---------------+
请帮助我。
答案 0 :(得分:0)
您可以使用array_contains(Array<T>, value)
进行加入,但是在Hive中,不允许使用非均等加入。因此,您可以进行交叉联接(或在没有ON条件的情况下进行联接,这是相同的),并使用
WHERE array_contains(t1.value, t2.value)
array_contains()
是一个布尔函数,因此您可以在WHERE子句中使用它,而无需附加条件。
但是根据表的大小,对爆炸值使用explode + join的解决方案可能会更好,因为交叉联接会将一个表的所有行乘以第二个表的所有行。