Hive---collect_list和collect_set

Posted Shall潇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

在这里插入图片描述

以上是关于Hive---collect_list和collect_set的主要内容,如果未能解决你的问题,请参考以下文章

vector 移除元素

mysql命令

mysql语句 索引操作

csharp 集合的并发,避免使用传统的锁(lock)机制等方式来处理并发访问集合。因此当有多个线程并发访问集合时,应首先考虑使用这些类代替System.Collections和System.Coll

STL 之copy()

Laravel 集合计数结果