当前位置: 首页 > news >正文

一文说清楚Hive中常用的聚合函数[collect_list]

collect_list(col)是Hive中常用的聚合函数,用于将分组内的某列值(col)收集到一个数组中。它的核心作用是将多行数据合并为单行的数组结构,常用于数据重组或复杂分析场景。以下是详细说明和示例:

一、函数特点

  1. 分组聚合:需配合GROUP BY使用,将每个分组内的col值收集为数组。
  2. 保留重复值:与collect_set(col)不同,collect_list不会去重,保留所有原始值(包括重复值)。
  3. 顺序不确定:默认不保证数组内元素的顺序(除非配合窗口函数ORDER BY)。

二、典型应用场景

  1. 用户行为序列分析:将用户的多次操作按时间串联为行为路径。
  2. 数据结构转换:将行式存储的数据转为列式(如将多行商品标签转为单个商品的标签数组)。
  3. 复杂统计:计算每个分组内的所有值的列表(如收集每个班级的所有学生成绩)。

三、示例演示

场景1:用户订单列表收集

需求:收集每个用户的所有订单ID,生成用户ID → [订单ID列表]的映射。
数据

user_id | order_id
------------------
1       | 1001
1       | 1002
2       | 1003
2       | 1003  -- 重复订单
3       | 1004

HQL

SELECT user_id,collect_list(order_id) AS order_list  -- 收集订单ID到数组
FROM orders
GROUP BY user_id;

结果

user_id | order_list
---------------------
1       | [1001, 1002]
2       | [1003, 1003]  -- 保留重复值
3       | [1004]
场景2:按时间排序的用户行为路径

需求:将用户的点击行为按时间顺序串联为路径(如首页→商品页→购物车)。
数据user_behavior表):

user_id | action_time         | page
-----------------------------------
1       | 2025-07-24 10:00:00 | 首页
1       | 2025-07-24 10:05:00 | 商品页
1       | 2025-07-24 10:10:00 | 购物车
2       | 2025-07-24 09:30:00 | 搜索页
2       | 2025-07-24 09:40:00 | 商品页

HQL

SELECT user_id,concat_ws('→', collect_list(page ORDER BY action_time)) AS behavior_path
FROM user_behavior
GROUP BY user_id;

结果

user_id | behavior_path
------------------------
1       | 首页→商品页→购物车
2       | 搜索页→商品页

关键点

  • ORDER BY action_time确保数组元素按时间排序。
  • concat_ws('→', ...)将数组元素用连接为字符串。
场景3:JSON数组生成(结合explode反向操作)

需求:将每个商品的多个标签从多行转为JSON数组格式。
数据product_tags表):

product_id | tag
-----------------
101        | 电子产品
101        | 手机
102        | 服装
102        | 男装
102        | 休闲装

HQL

SELECT product_id,collect_list(tag) AS tags_array  -- 生成标签数组
FROM product_tags
GROUP BY product_id;

结果

product_id | tags_array
-------------------------
101        | ["电子产品", "手机"]
102        | ["服装", "男装", "休闲装"]

延伸:若需转为JSON字符串,可结合to_json()函数:

to_json(collect_list(tag)) AS tags_json  -- 输出:"["电子产品","手机"]"

四、注意事项

  1. 内存风险:若单个分组的数据量过大(如某个用户有百万级订单),可能导致OOM(内存溢出),需控制分组数据规模或增加内存。
  2. collect_set对比
    • collect_list保留重复值,且不保证顺序(除非显式ORDER BY)。
    • collect_set自动去重,但同样不保证顺序。
  3. 数组长度限制:默认无限制,但过长的数组会影响性能,建议结合业务逻辑提前过滤无效数据。

五、性能优化建议

  1. 过滤先行:在GROUP BY前通过WHERE减少数据量,避免不必要的计算。
    示例:
    SELECT user_id,collect_list(order_id)
    FROM orders
    WHERE order_date >= '2025-01-01'  -- 先过滤近一年订单
    GROUP BY user_id;
    
  2. 配合窗口函数排序:若需严格按时间排序,可先通过窗口函数生成排序字段,再collect_list
    WITH sorted_orders AS (SELECT user_id,order_id,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_time) AS rnFROM orders
    )
    SELECT user_id,collect_list(order_id ORDER BY rn) AS ordered_orders
    FROM sorted_orders
    GROUP BY user_id;
    

通过collect_list,可高效地将多行数据合并为结构化数组,为复杂分析(如路径挖掘、序列预测)提供基础,是Hive中处理“一对多”关系的核心工具之一。

http://www.dtcms.com/a/296227.html

相关文章:

  • Percona pt-archiver 出现长事务
  • 工具篇之开发IDEA插件的实战分享
  • Docker可用镜像列表
  • 飞算JavaAI “新增接口信息” 功能:让接口设计更贴合实际需求
  • 美光MTFC8GAKAJCN-4M_IT型eMMC应用介绍
  • 小模数齿轮的加工方法有哪些?
  • 冷热数据分离
  • 深入云原生构建(CNB):颠覆传统,构建未来
  • Spring Cloud OpenFeign 常用注解_笔记
  • 一文说清楚Hive
  • 1. boost::asio之socket的创建和连接
  • C++常见面试题/笔试收录(一)
  • ARM 学习笔记(四)
  • Cartographer安装测试与模块开发(一)--Ubuntu20.04下Cartographer安装与Demo测试
  • SELinux策略定制于VPS服务器安全加固的配置方法
  • 离线进行apt安装的过程(在只能本地传输的ubuntu主机上使用apt安装)
  • 【Web APIs】JavaScript 节点操作 ⑧ ( 删除节点 - removeChild 函数 | 删除节点 - 代码示例 | 删除网页评论案例 )
  • 网站域名修改以及后续DNS配置
  • Java泛型初始化ArrayList<String>()和ArrayList<>()的区别
  • Vue3实现视频播放弹窗组件,支持全屏播放,音量控制,进度条自定义样式,适配浏览器小窗播放,视频大小自适配,缓冲loading,代码复制即用
  • C++面试8——虚函数表(vtable)
  • 【华为】笔试真题训练_20250611
  • uni-app支付宝小程序样式穿透失效
  • 森马联合新华社推出纪实短片《蹲下来试试》,以“蹲”演绎「森柔牛仔」柔韧体验
  • Android Telephony UrspRule 介绍
  • Windows上用于跨平台开发的环境工具
  • 普通三方App一般只能使用安卓原生Framework提供的公开接口
  • 螺杆支撑座安装后如何检验它的稳定性?
  • 力扣面试150题--在排序数组中查找元素的第一个和最后一个位置
  • Java中的静态变量是在“堆“还是“方法区“?