在 Hive 中,explode() 和侧视图 explode() 有啥区别

Posted

技术标签:

【中文标题】在 Hive 中,explode() 和侧视图 explode() 有啥区别【英文标题】:In Hive, what is the difference between explode() and lateral view explode()在 Hive 中,explode() 和侧视图 explode() 有什么区别 【发布时间】:2018-08-03 04:24:45 【问题描述】:

假设有一个表employee

+-----------+------------------+
| col_name  |    data_type     |
+-----------+------------------+
| id        | string           |
| perf      | map<string,int>  |
+-----------+------------------+

还有这张表里面的数据:

+-----+------------------------------------+--+
| id  |                perf                |
+-----+------------------------------------+--+
| 1   | "job":80,"person":70,"team":60   |
| 2   | "job":60,"team":80               |
| 3   | "job":90,"person":100,"team":70  |
+-----+------------------------------------+--+

我尝试了以下两个查询,但它们都返回相同的结果:

1. select explode(perf) from employee;
2. select key,value from employee lateral view explode(perf) as key,value;

结果:

+---------+--------+--+ | key | value | +---------+--------+--+ | job | 80 | | team | 60 | | person | 70 | | job | 60 | | team | 80 | | job | 90 | | team | 70 | | person | 100 | +---------+--------+--+

那么,它们之间有什么区别呢?我没有找到合适的例子。任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

对于您的特定情况,两个查询都可以。但是你不能在没有横向视图的情况下使用多个explode() 函数。所以,下面的查询会失败:

select explode(array(1,2)), explode(array(3, 4))

你需要这样写:

select
    a_exp.a,
    b_exp.b
from (select array(1, 2) as a, array(3, 4) as b) t
lateral view explode(t.a) a_exp as a
lateral view explode(t.b) b_exp as b

【讨论】:

以上是关于在 Hive 中,explode() 和侧视图 explode() 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

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

Hive函数之explode和inline

Hive之explode()函数和posexplode()函数和lateral view函数

解析Hive复杂字段1--lateral view explode

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

Hive表生成函数explode讲解