Hive中的行列转换:揭秘数据重塑的魔法(1)

文章目录

前言

一、行列转换是什么?

二、列转行操作

1.铺垫

2.进行转换

总结



前言

随着大数据时代的来临,Hive作为一种数据仓库工具在数据处理中扮演着重要的角色。而数据行列转换作为数据处理的核心操作,在Hive中也显得尤为重要。通过行列转换,我们能够更深入地理解数据的内在联系,发现数据背后的故事。


一、行列转换是什么?

Hive中的行列转换通常指的是将数据从行格式转换为列格式,或者从列格式转换为行格式。在Hive中,数据默认是以行格式存储的,即将多行数据存储在一个表中,每行数据由多个列组成。而行列转换则是将数据重新组织,将原本在多行中的多个值合并为单个值,或者将原本在单个值中的多个行拆分为多个值。行列转换在数据处理和分析中非常有用。通过行列转换,可以将数据重新组织成不同的格式,以便更好地进行数据分析、挖掘和可视化等操作。

二、列转行操作

行列转换在Hive中可以通过使用特定的函数和操作来实现。

使用explode函数则可以将一个列中的多个值拆分为多行数据,形成一个宽格式的列。

1.铺垫

使用explode函数则可以将一个列中的多个值拆分为多行数据,形成一个宽格式的列。

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数组.


总结

以上就是今天要讲的内容,本文仅仅简单介绍了列转行的简单操作,代码千千万,学会一点是一点,下次再见!