Hive:使用没有 LATERAL VIEW 的数组连接表爆炸
Posted
技术标签:
【中文标题】Hive:使用没有 LATERAL VIEW 的数组连接表爆炸【英文标题】:Hive: join tables with array without LATERAL VIEW explode 【发布时间】:2019-03-20 10:03:44 【问题描述】:我已经搜索了在 hive 上使用数组 coumn 连接表的方法,但所有答案都建议使用 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】:您可以使用 array_contains(Array<T>, value)
加入,但在 Hive 中不允许不等式加入。因此,您可以进行交叉连接(或不使用 ON 条件的连接,相同)并使用
WHERE array_contains(t1.value, t2.value)
array_contains()
是一个布尔函数,因此您可以在 WHERE 子句中使用它而无需附加条件。
但是根据您的表大小,对分解值使用explode+join 的解决方案可能会执行得更好,因为交叉连接将一个表中的所有行乘以第二个表中的所有行。
【讨论】:
以上是关于Hive:使用没有 LATERAL VIEW 的数组连接表爆炸的主要内容,如果未能解决你的问题,请参考以下文章
hive函数之~hive当中的lateral view 与 explode
Hive 行转列LATERAL VIEW explode使用方法
Hive 0.13 中带有 LATERAL VIEW 的子查询