hive行专列:将一行数据中的多个字段连接起来形成一列(array),所以行转列的关键是concat()函数
concat(col1,col2,…) 将多个String类型的字符串连接起来
concat_ws(‘分隔符’,col1,col2…) 特殊类型的concat,以指定分隔符的方式将多个字符串连接起来
collect_set(col) :col只能是基本苏剧类型,它将字段进行去重汇总操作,形成一个array类型的字段
原始数据:
zhao,a
zhao,b
zhao,c
qian,a
qian,d
sun,b
sun,c
sund
结果数据:
zhao a|b|c
qian a|d
sun b|c|d
建表:
caeate table tmp.row_to_col
(name ,string
score ,string)
row format delimited fields terminated by ',' stored as textfile ;
导入数据:
hdfs dfs -put /row_to_col.txt /user/hive/warehouse/db.tmp/row_to_col
行转列:
– collect_set类似聚合函数,其他字段要group by
select
name ,
concat_ws('|',collect_set(score)) as scores
from tmp.row_to_col
group by name
hive 列传行 : 对一列数据(array map)进行拆分,所以会用到拆分函数explode
explode(col) : 对hive中的复杂数据类型(array map) 进行拆分
lateral view udtf(expression) table_alias column_alias
lateral view : 用于和split explode 等UDTF(一进多出)一起使用 他能够将一列数据拆分成多行数据,在此基础上可以对拆分后的数据进行聚合操作
原始数据 :
zhao|yuwen,shuxue,yingyu
qian|dili,huaxue
结果数据:
zhao yuwen
zhao shuxue
zhao yingyu
qian dili
qian huaxue
建表:
create table tmp.col_to_row
(name string,
subject array<string>) -- 这里的列是array map这些复杂数据类型
row format delimited fileds terminated by '|'
collection items terminated by ',' -- 指定array类型字段的切割方式
stored as textfile ;
当hive表中涉及到复杂数据类型的时候,建表语句是:
row format delimited fileds terminated by ‘|’ – 列字段分割符 ’|‘
collection items terminated by ‘,’ array map struct 的分割符
map key terminated by ‘:’ map的key和value的分隔符
lines terminated by ‘\n’ 行分割符
列转行:
select
name ,
subjects
from tmp.col_to_row
lateral view explode(subject) tmp as subjects ;