Hive 行转列 explode和inline(lateral view)

本文详细介绍了在Hive中实现行转列的两种方法:lateralview explode和lateralview inline,通过具体实例展示了如何操作数组和结构体类型的列以生成新的列,适用于大数据处理场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@羲凡——只为了更好的活着

Hive 行转列 explode和inline(lateral view)

任何一个数据库都会涉及到行转列的问题,也同时会有相应的方法,比如mysql中的pivot。hive中使用的则是 lateral view explode 或者 lateral view inline

1.语法说明

a.lateral view explode

select source_column,new_column 
from source_table 
lateral view explode(source_column) new_table as new_column;

source_table:表示需要行转列的表
source_column:表示 source_table 中需要行转列的列
new_table:表示 lateral view explode 生成的新表名
new_column:表示 source_column 行转列后生成的新列名

b.lateral view inline

select source_column,new_column1,new_column2
from source_table 
lateral view inline(source_column) new_table as new_column1,new_column2;

source_table:表示需要行转列的表
source_column:表示 source_table 中需要行转列的列
new_table:表示 lateral view explode 生成的新表名
new_column1:表示 source_columnkey行转列后生成的新列名
new_column2:表示 source_columnvalue行转列后生成的新列名

2.创建表
CREATE TABLE `aarontest.table_array_struct_map`(
  `id` int, 
  `name` string,
  `attribute` array<struct<key:string,value:string>>)
ROW FORMAT delimited fields terminated by '\t'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':';
3.加载数据
load data local inpath "/hive/test" into table aarontest.table_array_struct_map;

查看导入结果
在这里插入图片描述

4.行转列(explode)
select name,c1.value from 
table_array_struct_map 
lateral view explode(attribute) t1 as c1 
where c1.key="city";

在这里插入图片描述

5.行转列(inline)
select name,c2 
from table_array_struct_map 
lateral view inline(attribute) t1 as c1,c2 
where c1="city";

在这里插入图片描述

===================================================================

@羲凡——只为了更好的活着

若对博客中有任何问题,欢迎留言交流

### 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; ``` 这样就可以得到包括所有源表记录在内的完整结果集合。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值