跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
SQLjava算法

Hive 常用聚合函数 collect_list 详解

Hive 中的 collect_list 聚合函数用于将分组内的列值收集为数组,保留重复值且不保证顺序。常用于用户行为序列分析、数据结构转换及复杂统计场景。使用时需配合 GROUP BY,可通过 ORDER BY 控制数组元素顺序。若单组数据量过大需注意内存溢出风险,建议结合窗口函数排序或提前过滤数据以优化性能。

RefactorPro发布于 2026/3/16更新于 2026/4/2614 浏览
Hive 常用聚合函数 collect_list 详解

一、函数特点

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

二、典型应用场景

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

三、示例演示

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

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

数据:

text
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;

结果:

text
user_id | order_list
---------------------
1       | [1001, 1002]
2       | [1003, 1003] -- 保留重复值
3       | [1004]

场景 2:按时间排序的用户行为路径

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

数据(user_behavior 表):

text
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;

结果:

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

关键点:

  • ORDER BY action_time 确保数组元素按时间排序。
  • concat_ws('→', ...) 将数组元素用 → 连接为字符串。

场景 3:JSON 数组生成(结合 explode 反向操作)

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

数据(product_tags 表):

text
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;

结果:

text
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. 数组长度限制:默认无限制,但过长的数组会影响性能,建议结合业务逻辑提前过滤无效数据。

五、性能优化建议

配合窗口函数排序:若需严格按时间排序,可先通过窗口函数生成排序字段,再 collect_list。

WITH sorted_orders AS (
    SELECT user_id, order_id, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_time) AS rn
    FROM orders
)
SELECT user_id, collect_list(order_id ORDER BY rn) AS ordered_orders
FROM sorted_orders
GROUP BY user_id;

过滤先行:在 GROUP BY 前通过 WHERE 减少数据量,避免不必要的计算。

示例:

SELECT user_id, collect_list(order_id)
FROM orders
WHERE order_date >= '2025-01-01' -- 先过滤近一年订单
GROUP BY user_id;

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

目录

  1. 一、函数特点
  2. 二、典型应用场景
  3. 三、示例演示
  4. 场景 1:用户订单列表收集
  5. 场景 2:按时间排序的用户行为路径
  6. 场景 3:JSON 数组生成(结合 explode 反向操作)
  7. 四、注意事项
  8. 五、性能优化建议
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 在Windows11利用llama.cpp调用Qwen3.5量化模型测试
  • Spring Cloud Sentinel 熔断降级核心原理与实战指南
  • 基于 FPGA 的以太网 UDP 通信实现与实战
  • 轻小说机翻机器人:日语小说自动翻译工具搭建
  • Python 个性化音乐推荐系统:Django+MySQL 结合双协同过滤算法
  • OpenClaw 飞书机器人配置指南:聊天窗口下达 AI 指令
  • Go 语言快速学习总结
  • AI 辅助开发 SpringBoot 在线图书借阅平台实践
  • KWDB 运维实战:用 SQL 打通 Metrics 与 CMDB
  • Spring Boot 集成数据仓库与 ETL 工具实战
  • STC 单片机摄像头图像处理优化与搜线算法实战
  • 动态规划:买卖股票最佳时机(含冷冻期与手续费)
  • 医疗自然语言处理(NLP)应用场景与实战开发
  • Vue 3 前端开发实战与成长经验总结
  • 8 大 AI 平台速度与 Token 消耗性能测试
  • Mac 微信双开的三种实现方法
  • EIAM 开源企业身份管理平台实战
  • Java 充电桩平台故障排查优化:日志分级存储与链路关联方案
  • Spring Cloud Nacos 负载均衡策略与实践
  • Visual Studio Code 集成 Cursor AI 实战指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online