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

Spark SQL 聚合函数:collect_list 与 collect_set 用法详解

Spark SQL 聚合函数:collect_list 与 collect_set 用法详解

官网:
https://spark.apache.org/docs/latest/api/sql/index.html#collect_list

在这里插入图片描述

1. 函数简介

collect_list(expr)
  • 功能:收集并返回一个包含所有元素(允许重复)的列表。

在这里插入图片描述

  • 特点
    • 不去重
    • 保持输入顺序(如果输入顺序确定)
    • 非确定性(因为输出顺序依赖于输入行的顺序,而这个顺序可能是非确定性的)

collect_set(expr)
  • 功能:收集并返回一个包含唯一元素的集合(自动去重)。

在这里插入图片描述

  • 特点
    • 自动去重
    • 不保证输出顺序(因为是集合)
    • 非确定性(因为输出顺序依赖于输入行的顺序)

Tips:

在这里插入图片描述

  • 内存消耗:当处理大数据集时,这两个函数都可能导致内存问题,特别是 collect_list 因为它不进行去重操作。
  • 非确定性:由于这些函数依赖于输入行的顺序,而这个顺序可能因执行计划的不同而变化,因此结果集的顺序也可能不同。

在这里插入图片描述

collect_list 的结果依赖数据的物理顺序,特别是在分布式环境中,顺序是不确定的。

如果希望结果有序,可以使用 sort_array 显式排序。

https://spark.apache.org/docs/latest/api/sql/index.html#sort_array

在这里插入图片描述

在这里插入图片描述

SELECTs.name,sort_array(collect_list(g.score), false) AS sorted_scores
FROM students s
JOIN grades g ON s.student_id = g.student_id
GROUP BY s.name;

在这里插入图片描述


Demo:

1: 使用 collect_list 收集每个角色的所有技能(包括重复)
WITH warriors_skills AS (SELECT '悟空' AS warrior, '龟派气功' AS skill UNION ALLSELECT '悟空', '瞬间移动' UNION ALLSELECT '悟空', '龟派气功' UNION ALLSELECT '贝吉塔', '毁灭闪光' UNION ALLSELECT '贝吉塔', '最终闪光' UNION ALLSELECT '比克', '魔贯光杀炮'
)SELECT warrior, collect_list(skill) AS all_skills
FROM warriors_skills
GROUP BY warrior;
+---------+----------------------------------+
| warrior | all_skills                       |
+---------+----------------------------------+
| 悟空    | ["龟派气功", "瞬间移动", "龟派气功"]|
| 贝吉塔  | ["毁灭闪光", "最终闪光"]          |
| 比克    | ["魔贯光杀炮"]                    |
+---------+----------------------------------+
  • collect_list 函数保留了所有的技能名称,包括重复的“龟派气功”。

2: 使用 collect_set 收集每个角色的独特技能(去重)

如果我们只关心每个角色使用过的独特技能,可以使用 collect_set 函数:

WITH warriors_skills AS (SELECT '悟空' AS warrior, '龟派气功' AS skill UNION ALLSELECT '悟空', '瞬间移动' UNION ALLSELECT '悟空', '龟派气功' UNION ALLSELECT '贝吉塔', '毁灭闪光' UNION ALLSELECT '贝吉塔', '最终闪光' UNION ALLSELECT '比克', '魔贯光杀炮'
)SELECT warrior, collect_set(skill) AS unique_skills
FROM warriors_skills
GROUP BY warrior;
+---------+--------------------------+
| warrior | unique_skills            |
+---------+--------------------------+
| 悟空    | ["龟派气功", "瞬间移动"]   |
| 贝吉塔  | ["毁灭闪光", "最终闪光"]   |
| 比克    | ["魔贯光杀炮"]             |
+---------+--------------------------+
  • collect_set 自动去除了重复的技能名称,确保每个技能仅出现一次。

整理不易 列位多多支持呀~

在这里插入图片描述

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

相关文章:

  • ADAS测试:如何用自动化手段提升VV效率
  • 04动手学深度学习(下)
  • AOP实现接口幂等
  • B树、B+树、红黑树区别
  • Solidity基础(教程④-ERC-4626收益金库)
  • 被困扰的elementplus样式修改问题:select选择器修改和el-input修改
  • PHP企业级应用架构:微服务通信、分布式事务与性能优化
  • 短剧系统开发上线全流程攻略:从架构设计到性能优化
  • 页面性能优化
  • SpringBoot轻松集成豆包AI
  • Cacti RCE漏洞复现
  • Android Studio关于Connection refused: connect报错
  • “车位到车位”自动驾驶真相
  • pcm,msd调制解调仿真
  • WCF服务通信框架
  • 用友NC漏洞批量检测工具,支持POC显示、单一检测、批量检测、结果导出、AI交互等
  • Parasoft Virtualize用服务虚拟化加速银行系统的软件测试
  • Red Hat OpenShift AI 产品简介
  • XCF32PVOG48C Xilinx Platform Flash PROM
  • 神经网络CNN、RNN、Transform
  • 【实时Linux实战系列】在实时应用中进行负载均衡
  • Docker 部署 Supabase并连接
  • 【Linux】重生之从零开始学习运维之Mysql
  • 深度学习篇---层与层之间搭配
  • 基于Qlearning强化学习的水下无人航行器路径规划与避障系统matlab性能仿真
  • 免费离线翻译软件LibreTranslate免安装一键启动整合包下载
  • JavaScript 回调函数讲解_callback
  • LeetCode|Day28|67. 二进制求和|Python刷题笔记
  • 波形发生器AWG硬件设计方案
  • AW2013 LED驱动芯片 工作方式介绍