Hive---collect_list和collect_set

collect_list 和 collect_set 都是实现将某一列合并成一行(列转行)的作用。

二者区别:

  • collect_list : 返回包含重复元素的集合
  • collect_set :返回去除重复元素的集合
    在这里插入图片描述

如何实现列转行的呢

举个例子

首先建个表

create table user_film(
user_name string,
film_name string
)partitioned by(day string)
row format delimited
fields terminated by '\t';

加载数据

uf.txt

Tom     生活大爆炸
Jack    武林外传
Tom     巧克力工厂
Mike    武林外传
Jack    超人总动员2
Jack    寻屋环游记
Mike    蜘蛛侠
Mike    武林外传
load data local inpath '/opt/tmp/uf.txt' into table user_film partition(day = '2021-06-06');

查看数据
在这里插入图片描述
查看每个用户看过的 film

  1. collect_list
select user_name,collect_list(film_name) films from user_film group by user_name;

在这里插入图片描述
可以看到Mike 那行出现了两个 武林外传,如果我们不想这样怎么办,那就用下面的

  1. collect_set
select user_name,collect_set(film_name) films from user_film group by user_name;

在这里插入图片描述

【注意:当使用 collect_list 或者collect_set 函数时,是不需要将字段写入group by 中的】

可是有人不想要两边的框【】,而且不想看到引号,最好能换个分隔符,怎么弄?

答:那就需要 concat_ws

  • concat :字符串拼接,大家比较熟悉了,但是拼接到 NULL 的时候,整个都为 NULL
  • concat_ws :字符串拼接,指定分割符,而且拼到为NULL的也不影响

concat
在这里插入图片描述
concat_ws
在这里插入图片描述

使用concat_ws进行处理

select user_name,concat_ws("|",collect_set(film_name)) films fromuser_name;

在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值