五分钟学会hive中的行转列,列转行(UDAF和UDTF)以及concat,collect_set,concat_ws用法

准备数据:

nameconstellationblood_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平台通过图形化页面来完成

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值