2021-01-05

hive中行转列,列转行

说实话,这个问题困扰了我许久,因为目前目前来说用的不是很多,但是个人觉得还是非常有必要了解一下的,今天就将它一点点剖析明白。

  • 行专列,什么是行专列?
    行专列举个简单的例子,一个人身上有多个标签,假如说乔丹,曾经效力于’公牛,奇才’,然后身上的标签有’篮球之神,黑人’,这两种标签,本来是一对多关系,如果你想让他变成一对一关系,就可以用行专列
    假如本来是:
name    team     tab
科比	  湖人,黄蜂	帅哥,光头,实力派
乔丹	  公牛,奇才	篮球之神,黑人
詹姆士	骑士,湖人	小皇帝,实力派,大胡子

然后标签分开后变成

name  team   tab
科比	 湖人	帅哥
科比  湖人	光头
科比	 湖人	实力派
科比	 黄蜂	帅哥
科比	 黄蜂	光头
科比	 黄蜂	实力派
乔丹	 公牛	篮球之神
乔丹	 公牛	黑人
乔丹	 奇才	篮球之神
乔丹	 奇才	黑人
詹姆士	骑士	小皇帝
詹姆士	骑士	实力派
詹姆士	骑士	大胡子
詹姆士	湖人	小皇帝
詹姆士	湖人	实力派
詹姆士	湖人	大胡子

这就是典型的行专列,行专列主要用到lateral view 配合炸裂函数explode来实现
创建表语句

create table people(
name varchar(30),
team varchar(50),
tab varchar(50)
);

插入数据

insert into people values('科比','湖人,黄蜂','帅哥,光头,实力派'),
                   ('乔丹','公牛,奇才','篮球之神,黑人'),
                   ('詹姆士','骑士,湖人','小皇帝,实力派,大胡子');

使用later view 配合 explode

select name,t_team.a,t_tab.b from lsj.people
lateral view explode(split(team,',')) t_team as a
lateral view explode(split(tab,',')) t_tab as b;

lateral view 其实就是创建一个张虚拟的表,然后你从这张表中拿东西
用法如下:

lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
fromClause: FROM baseTable (lateralView)*

版权声明:本文为qq_44769220原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。