Hive 行转列 & 列转行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive 行转列 & 列转行相关的知识,希望对你有一定的参考价值。

参考技术A hive中行转列和列转行比较常见,一般是用于中间数据的生产。

行转列一般采用IF进行判断,筛选出本列对应的数据进行统计。

如果我们直接

就会报错

那么,我们由此引入LATERAL VIEW函数

对一列进行炸裂,其他列保持不变

对多列进行炸裂,其他列保持不变

行和列转换的问题主要解决存储和计算过程中关联关系不对等的问题。

hive关于行转列,列转行的使用

参考技术A 行转列:
定义:就是把形如
id --------- name
1 --------- a
2 --------- a
3 --------- a
4 --------- a
的数据转换为
id ------------- name
1,2,3,4 --------- a
这里把四行的数据变成了由一行显示,这就是行转列。

首先要用到的是collect_set或者collect_list,前者去重,后者不去重,一般配合group使用,能把形如:
id --------- name
1 --------- a
2 --------- a
3 --------- a
4 --------- a
转换为
id --------- name
["1","2","3","4"] --------- a

然后需要用到的是concat_ws函数,这个函数需要传递指定分隔符,以及字符串或者字符串数组。能起到把多个字符串拼接到一起的作用。
形如:
id --------- name
["1","2","3","4"] --------- a
通过concat_ws(',',[1,2,3,4])转换为
id --------- name
1,2,3,4 --------- a

连起来就完成了行转列
一般sql为:

列转行
定义:就是把形如
id ------------- name
1,2,3,4 --------- a
的数据转换为
id --------- name
1 --------- a
2 --------- a
3 --------- a
4 --------- a
这里把一行的数据变成了由四行显示,这就是列转行。

首先要用到split函数,这个行数可以把字符串按照指定的规则切分为字符串数组。
形如:
id --------- name
1,2,3,4 --------- a
通过split('1,2,3,4',',')转换为
id --------- name
["1","2","3","4"] --------- a

然后是explode函数,这个行数可以把数组的每个元素转换为一行。
形如
id
["1","2","3","4"]
通过explode(["1","2","3","4"] )转换为
id
1
2
3
4

最后为了拼接其它字段,还需要用到lateral view把explode获得的行当虚拟表来用。
使用方法为 lateral view explode(split(["1","2","3","4"] , ',')) tmptable as new_id ;
其中new_id元素为转换为行后的字段名。

把以上综合起来就完成了列转行
一般sql为:

以上是关于Hive 行转列 & 列转行的主要内容,如果未能解决你的问题,请参考以下文章

hive的行转列和列转行

Hive之列转行,行转列

Hive之列转行,行转列

Hive sql 行列转换(行转列,列转行)

Hive 行转列和列转行

hive列转行行转列