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 条件的连接,相同)并使用

过滤乘以 CROSS JOIN 的行

WHERE array_contains(t1.value, t2.value)

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

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

【讨论】:

以上是关于Hive:使用没有 LATERAL VIEW 的数组连接表爆炸的主要内容,如果未能解决你的问题,请参考以下文章

Hive学习之Lateral View

hive函数之~hive当中的lateral view 与 explode

Hive 行转列LATERAL VIEW explode使用方法

Hive 0.13 中带有 LATERAL VIEW 的子查询

Hive轻松使用explode和lateral view,实现行转列

Hive行转列(explode/lateral view)