文章目录
前言
一、行列转换是什么?
二、列转行操作
1.铺垫
2.进行转换
总结
前言
随着大数据时代的来临,Hive作为一种数据仓库工具在数据处理中扮演着重要的角色。而数据行列转换作为数据处理的核心操作,在Hive中也显得尤为重要。通过行列转换,我们能够更深入地理解数据的内在联系,发现数据背后的故事。
一、行列转换是什么?
Hive中的行列转换通常指的是将数据从行格式转换为列格式,或者从列格式转换为行格式。在Hive中,数据默认是以行格式存储的,即将多行数据存储在一个表中,每行数据由多个列组成。而行列转换则是将数据重新组织,将原本在多行中的多个值合并为单个值,或者将原本在单个值中的多个行拆分为多个值。行列转换在数据处理和分析中非常有用。通过行列转换,可以将数据重新组织成不同的格式,以便更好地进行数据分析、挖掘和可视化等操作。
二、列转行操作
行列转换在Hive中可以通过使用特定的函数和操作来实现。
使用
1.铺垫
使用
explode()函数,爆炸函数,属于UOTF(表生成函数),一进多出,只能处理数组或者字典
代码如下(示例):
select `array`(11,22,33); select explode(array(11,22,33)); -- 一进多出,列转行
select explode(map(11, 22, 33)); -- 报错, map是键值对类型, 元素个数必须成对出现.
select explode(map(11, 22, 33, 44));
2.进行转换
有一行数据如下:
Chicago Bulls,1991|1992|1993|1996|1997|1998
我们想要的格式:
team_name champion_year Chicago Bulls 1991 Chicago Bulls 1992 Chicago Bulls 1993 Chicago Bulls 1996 Chicago Bulls 1997 Chicago Bulls 1998
思路很明了,用刚才的explode()函数把champion_year字段炸开即可
代码如下(示例):
select explode(champion_year) as champion_year from the_nba_championyear;
走到这里, 就剩下最后1步了, 在上述查询基础上, 加入: team_name即可, 写法如下.
select team_name, explode(champion_year) as champion_year from the_nba_championyear;
想法OK,但是报错
错误产生原因:炸裂后的数据,无法直接和原表查询,因为对应的关联信息不精准(炸裂后的每一行,具体对应的是炸裂前的哪一行数据,对不上)
解决方案:通过侧视图(lateral view)实现,它是Hive提供的一种专门用来记录炸裂前后,数据对应关系的函数
侧视图格式:lateral view explode()函数 侧视图的名字 as 炸裂后数据的列名
select a.team_name, b.champion_year from the_nba_championyear a lateral view explode(champion_year) b as champion_year;
ps:explode()只能处理 数组array, 映射map数据。 可以通过split()函数把字符串转成 array数组.
总结
以上就是今天要讲的内容,本文仅仅简单介绍了列转行的简单操作,代码千千万,学会一点是一点,下次再见!