hive列拆分与行转列lateral view explode用法

有时候我们在处理数据时,会遇到某个列存在多值的情况,如果想拿到里面的每个值进行后续的处理的话,这种情况下有两种处理方式,如果是固定数目的多值,可以使用split切分,如果不定数目的。下面我们就来看看具体怎么处理。

步骤1

先把要转换的各列拼到一起,如有9列,下面为了测试方便,我用1,2,3,4,5,6,7,8,9代替,sql为

select concat_ws(',','1','2','3','4','5','6','7','8','9') from test.dual;

其中我的test.dual为只有一条记录的表,可以根据需要变动
效果如下:
hive列拆分与行转列lateral view explode用法_第1张图片

步骤2

用split函数把上面拼接的字符串转换为分割数组,类型为array。sql为

select split(concat_ws(',','1','2','3','4','5','6','7','8','9'),',')  sp from test.dual;

效果如下:
hive列拆分与行转列lateral view explode用法_第2张图片

步骤3

上面返回结果为array数组类型,如果想取上面数组的第5个数的值也就是5,加个下标就可以(注:跟行转列无关)sql为:

select split(concat_ws(',','1','2','3','4','5','6','7','8','9'),',')[4]from test.dual; 

效果图如下:
hive列拆分与行转列lateral view explode用法_第3张图片

步骤4

用explode函数实现行转列,sql为

 select explode(split(concat_ws(',','1','2','3','4','5','6','7','8','9'),',')) from test.dual;

效果如下:
hive列拆分与行转列lateral view explode用法_第4张图片

步骤5

上面方法实现了行转列,不过仅仅实现了一列,如果表中还有其他字段,也想一起显示出来,就要用到lateral view 了,不过写法更上面有些不同,sql为:

select s.*,sp from test.dual s lateral view explode(split(concat_ws(',','1','2','3','4','5','6','7','8','9'),',')) t as sp;

效果如下图:
hive列拆分与行转列lateral view explode用法_第5张图片

步骤6

解释一下,from后面是你的表名,在表名后面加lateral view explode。。。(你的行转列sql) ,还必须要起一个别名,我这个字段的别名为sp。然后再看看select后面的 s.*,就是原表的字段,我这里面只有一个字段,且为X,效果就是上面的图片效果了。

原文链接:hive行转列lateral view explode用法

你可能感兴趣的:(大数据)