准备数据:
name | constellation | blood_type |
---|---|---|
小明 | 小熊座 | R |
小红 | 猎户座 | XR |
小白 | 猎户座 | R |
小蓝 | 小熊座 | R |
小绿 | 小熊座 | R |
行转列
创建表并导入数据
create table person_info(
name string, constellation string, blood_type string)
row format delimited fields terminated by "\t";
//导入数据
load data local inpath '/home/datas/a.txt' into table person_info;
把星座和血型一样的人归类在一起
select t1.base,
concat_ws('|', collect_set(t1.name)) name
from (select name,
concat(constellation, ",", blood_type) base
from person_info) t1
group by t1.base;
可以得到下面结果形式
可以看到行转列已经成功
列转行
我们把行转列结果当做列转行的测试数据:
为了省事建立新表person2,但是有问题
create table person2 as
select t1.base,concat_ws('|', collect_set(t1.name)) name from
(select name,concat(constellation, ",", blood_type) base
from person_info) t1 group by t1.base
新表数据如下
执行下面命令,发现报错
select base , category_name from
person2 lateral view explode(name) table_tmp as category_name;
但是此时查看表结构
可以看到我们的name字段为string,但我们需要的是array<string> 类型,所以这个表不能用,我们还是自己在创一个表吧
新建一个表并导入一些数据
create table movie_info( movie string, category array<string>)
row format delimited fields terminated by "\t" collection items terminated by ",";
//导入数据
load data local inpath "/home/hadoop/test/c.txt" into table movie_info;
//查看
select * from movie_info;
将电影分类的数据数据展开:真正列转行
select movie, category_name
from movie_info lateral view explode(category) table_tmp as category_name;
处理结果
总结:
在上面的描述里我们可以看到:
列转行(UDTF):将一行变多行
行转列(UDAF):多行变一行
而且用到了几个函数
concat(字段1,“分隔符”,字段2):连接两个字段
concat_ws(“分隔符”,字段集合)分割集合内字段
collect_set(字段):把字段放入集合等待处理,并具有去重功能
以上操作也可以在hue平台通过图形化页面来完成