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
- collect_list
select user_name,collect_list(film_name) films from user_film group by user_name;
可以看到Mike 那行出现了两个 武林外传,如果我们不想这样怎么办,那就用下面的
- 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的主要内容,如果未能解决你的问题,请参考以下文章
csharp 集合的并发,避免使用传统的锁(lock)机制等方式来处理并发访问集合。因此当有多个线程并发访问集合时,应首先考虑使用这些类代替System.Collections和System.Coll