collect_list 和 collect_set 有什么区别?

collect_listcollect_set 是 Hive 中用于聚合数据的两个常用函数,它们的主要区别在于是否去除重复值以及结果的顺序性。以下是它们的详细对比:

1. 功能区别

  • collect_list
    • 功能:将指定列的所有值(包括重复值)收集到一个数组中
    • 特点:保留所有值,不进行去重,结果数组中的值按照原始数据的顺序排列
  • collect_set
    • 功能:将指定列的值收集到一个数组中,并自动去除重复值
    • 特点:返回唯一值的集合,结果数组中的值顺序是不确定的

2. 使用场景

  • collect_list
    • 适用于需要保留所有值(包括重复值)的场景
    • 例如,统计每个用户的所有订单详情,保留重复的订单记录
  • collect_set
    • 适用于需要去除重复值的场景
    • 例如,统计每个用户购买过的不同产品

3. 性能和注意事项

  • collect_list
    • 由于保留所有值,可能导致生成的数组较大,尤其在数据量大的情况下需要注意内存限制
  • collect_set
    • 去除重复值后,生成的数组通常更小,但结果顺序不确定
    • 如果需要对结果排序,可以结合 sort_array 函数

4. 示例

假设有一个表 orders,包含以下列:
  • customer_id:客户ID
  • product:产品名称
数据如下:
customer_idproduct
101 iPhone
101 iPhone
101 MacBook Pro
102 iPad
102 iPad

使用 collect_list

sql复制
SELECT customer_id, collect_list(product) AS products
FROM orders
GROUP BY customer_id;
结果:
customer_idproducts
101 ["iPhone", "iPhone", "MacBook Pro"]
102 ["iPad", "iPad"]

使用 collect_set

sql复制
SELECT customer_id, collect_set(product) AS products
FROM orders
GROUP BY customer_id;
结果:
customer_idproducts
101 ["iPhone", "MacBook Pro"]
102 ["iPad"]

总结

  • 如果需要保留所有值(包括重复值),使用 collect_list
  • 如果需要去除重复值,使用 collect_set
  • 两者都返回数组类型,但 collect_set 的结果无序

posted on   ExplorerMan  阅读(43)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2021-02-25 redis面试题汇总
2021-02-25 消息队列面试题
2021-02-25 MongoDB面试题
2021-02-25 高并发系统限流-漏桶算法和令牌桶算法
2021-02-25 RedisCluster的rename机制失败报错,解决又是数据倾斜问题
2021-02-25 开发如何避免redis集群访问倾斜和数据倾斜
2021-02-25 Pika 连接 rabbitmq 集群

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示