一.行转列

concat

CONCAT(string A/col, string B/col…):对字符串按次序进行拼接

concat_ws

concat_ws(string SEP, string A, string B...):与concat()类似,但使用指定的分隔符喜进行分隔

concat_ws(string SEP, array< string>):拼接Array中的元素并用指定分隔符进行分隔

collect_set

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

collect_list

COLLECT_LIST(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行不去重汇总,产生array类型字段。

将原始表转换为指定的格式,把星座和血型一样的人归类到一起

思路:先将两个字段聚合,然后分组处理

原始数据 :constellation_blood.txt

name	constellation	blood_type
孙悟空	白羊座	A
大海	射手座	A
宋宋	白羊座	B
猪八戒	白羊座	A
凤姐	射手座	A
苍老师	白羊座	B
create table constellation_blood(
   name string,
   constellation string,
   blood_type string
row format delimited fields terminated by '\t';

向表中导入数据

load data local inpath '/opt/module/testdata/function_test/constellation_blood.txt' into table constellation_blood;

验证表数据

select * from constellation_blood;

第一步:将星座(constellation)和血型(blood_type)用逗号拼接,转为以下格式

	select 
		concat_ws(',',constellation,blood_type) con_blo,
	FROM constellation_blood;

第二步:在第一步的基础上根据星座,血型(con_blo)进行分组,通过collect_list或者collect_set将同组多行数据根据name字段聚合成一个数组(array< string>),再通过concat_ws对 数组进行拆分拼接;

select 
	t1.con_blo,
	concat_ws('|',collect_list(t1.name))
	select 
		concat_ws(',',constellation,blood_type) con_blo,
	FROM constellation_blood
group by t1.con_blo;

二.列转行

split

Split(str, separator):将字符串按照后面的分隔符切割,转换成字符array。

explode

EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。

lateral view

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

解释:lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

lateral view首先为原始表的每行调用UDTF,UTDF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。

movie category

向表中加载数据

load data local inpath '/opt/module/testdata/function_test/movie_info.txt' into table movie_info;

验证表数据

select * from movie_info;

第一步:用split将category切分成数组,用explode函数将category数组炸开

select 
	explode(split(category,','))
from movie_info;

第二步:用lateral view函数对原表的movie字段对炸开表进行侧写

select
	movie,
	category_name
from movie_info
lateral view 
explode(split(category,',')) movie_tmp AS category_name;