hive:explode() 与 lateral view

本文介绍了如何使用explode()和lateral view等函数将宽表转换为窄表的方法。通过实例演示了如何处理多值字段并进行聚合统计。

一、解决如下问题

如何由上面的宽表变成下面的窄表?

这里写图片描述
这里写图片描述

二、explode()

explode() takes in an array (or a map) as an input and outputs the elements of the array (map) as separate rows.
explode() 函数接收array或map类型数据,并分行返回数据的每一个元素。注意输入必须是array或map类型,字符串不可以。因此好多情况下都要借助split()。
实例:
select explode(split(test_data,’,’)) from test
输出:
这里写图片描述

三、lateral view

上面实现了单列的行转列,但是并没有跟date字段进行匹配。这就需要用到lateral view。
Lateral view:lateral view is used in conjunction with user-defined table generating functions such as explode(). As mentioned in Built-in Table-Generating Functions, a UDTF generates zero or more output rows for each input row. A lateral view first applies the UDTF to each row of base table and then joins resulting output rows to the input rows to form a virtual table having the supplied table alias.
Lateral view:lateral view用于和split、explode等UDTF一起使用的,能将一行数据拆分成多行数据,在此基础上可以对拆分的数据进行聚合,lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一行或者多行,lateral view在把结果组合,产生一个支持别名表的虚拟表。
select date date_t,test_data_t from test lateral view explode(split(test_data,’,’)) test_data_t as test2;
输出:
这里写图片描述

四、这时就可以用聚合函数进行聚类统计了

可以按date_t对test_data_t进行sum、count、avg等等。

### Hive `LATERAL VIEW` 和 `EXPLODE` 函数详解 #### 语法结构 在Hive查询语句中,`LATERAL VIEW`用于处理复杂的数据类型,如数组或映射。通过`EXPLODE`函数结合使用,可以将这些复杂类型的元素展开成多行数据。 ```sql SELECT column1, ... , udtf_column_alias FROM source_table LATERAL VIEW EXPLODE(complex_column) exploded_table AS udtf_column_alias; ``` 此语法允许用户指定要爆炸的列以及生成的新别名和新列别名[^1]。 #### 实际应用案例 考虑有一个名为`src`的格,其中包含一列示用户的ID及其关联的兴趣标签组成的数组: | id | tags | |----|------------------------| | 1 | ["music", "sports"] | | 2 | ["travel", "photography"]| 为了获取每一对(id, tag),可执行如下SQL命令来实现这一目标: ```sql SELECT id, value FROM src LATERAL VIEW explode(tags) exploded_tags AS value; ``` 这会返回如下所示的结果集: | id | value | |--| | 1 | music | | 1 | sports | | 2 | travel | | 2 | photography | 当遇到某些记录中的复杂字段为空或NULL的情况时,可以通过添加关键字`OUTER`到`LATERAL VIEW`之后确保即使原中有空值也能保留原始行而不丢失任何信息。 例如,在上述例子基础上如果希望对于那些tags为空或者不存在的情况下也能够显示对应的id,则应修改查询为: ```sql SELECT id, value FROM src LATERAL VIEW OUTER explode(tags) exploded_tags AS value; ``` 这样就可以得到包括所有源记录在内的完整结果集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值