Hive行列转换

Python面面观

共 1459字,需浏览 3分钟

 ·

2021-03-05 21:39

之前写过一篇SQL行列转换,主要是使用 max(case when ... then ... else ...  end) 行转列,union 列转行。在 Hive 中同样也提供了两种方式进行行列转换。

lateral view explode 列转行

lateral view 和 explode 将 hive 一系列中复杂的 array 或者 map 结构拆分成多行数据,在此基础上可以对拆分后的数据进行聚合。

思路:

  1. 先用 split 函数将 C 列分割成数组;
  2. 再使用 lateral view 结合 explode 炸裂。
select A, B, C_new from table1
lateral view explode(split(C,",")) temp_table AS C_new;

concat_ws 行转列

  • concat(str1, str2):返回输入字符串连接后的结果,支持任意个输入字符串。
  • concat_ws(separator,str1,str2,...):它是一个特殊形式 concat,第一个参数为分隔符,如果分隔符是 NULL,返回值也将为 NILL,这个函数会跳过分隔符参数后的任何 NULL 和空字符串,分隔符被加到被连接的字符串之间。
  • collect_set(col):函数只接受基本数据类型,它的主要将某字段的值进行去重汇总,产生 array 类型字段。

思路:

  1. 先使用 concat(constellation,",",blood_type),将星座和血型连接;
  2. 用 collect_set 函数对 name 聚合;
  3. 用 concat_ws 函数对聚合后的 name 用"|"分割。
select 
         constellation_blood_type  ,
         concat_ws("|",collect_set(name))
from 
         (select 
        concat(constellation,",",blood_type) constellation_blood_type  
        name
from 
       person_info)t1   
group by constellation_blood_type ;
浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报