行转列:
1.行转列所用的函数
CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;
CONCAT_WS(separator, str1, str2,…):它是一个特殊形式的 CONCAT()。第一个参数作为剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段(也就是将一列字段去重以后放在一个数组中)。
案例分析:原数据为用户的姓名,住址,年龄(中间为\t分割)。
目标数据:(先将住址和年龄合并成一列数据,再将住址和年龄相同的用户放到一起形成如下的表)
2.按照住址和年龄分组,然后用COLLECT_SET(col)函数将用户名变为一行。
实际操作:
1.建表:
create table usertab(
name string,
address string,
age string)
row format delimited fields terminated by "\t";
2.导入数据并查询:
load data local inpath '/opt/demo.txt' into table usertab;
接上面思路分析第一步:先将住址和年龄合并成一列数据
select name,concat_ws(',',address,age) address_age from usertab;
第二步:按照住址和年龄分组,然后用COLLECT_SET(col)函数将用户名变为一行,最后用concat_ws()函数来连接用户名字。
select address_age,concat_ws('-',collect_set(name)) from (select name,concat_ws(',',address,age) address_age from usertab) t group by address_age;
最终结果:
列转行:
EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。
LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
案例:原数据为姓名和喜欢吃的水果(\t分割字段)
目标数据,将原数据中每个人喜欢吃的水果分成多行,如下为目标数据。
1.创建表并且导入数据
create table fruit(
name string,
like_fruits array<string>)
row format delimited fields terminated by "\t"
collection items terminated by ",";
load data local inpath "/opt/fruit.txt" into table fruit;
查询数据的sql
select
name,
like_fruits_name
from
fruit lateral view explode(like_fruits) table_tmp as like_fruits_name;
这里需要注意的是函数explode(like_fruits)的别名是在as 后面,table_tmp为explode函数将like_fruits字段中的值分解后形成的表。