在 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()函数和posexplode()函数和lateral view函数
解析Hive复杂字段1--lateral view explode