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

Spark SQL 数组函数合集:array_agg、array_contains、array_sort…详解

Spark SQL 数组函数合集

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

在这里插入图片描述


函数分类 & 用途一览表:

函数名类型用途
array_agg聚合收集字段为数组
array_contains检查判断数组是否包含某个值
array_size查询获取数组长度
array_sort排序对数组排序
array_distinct去重去除数组中的重复元素
array_remove修改删除数组中某个值
array_append / array_prepend修改在数组尾部/头部添加元素
array_union / array_intersect / array_except集合操作并集、交集、差集
array_join转换把数组转成字符串
array_max / array_min查询获取数组中的最大/最小值
array_position查询获取某个值在数组中的位置
arrays_overlap检查两个数组是否有交集
arrays_zip合并合并多个数组为结构数组
array_compact清洗删除数组中的 NULL 值
array_repeat构造重复构造数组
array_insert修改在指定位置插入元素

Demo with 龙珠🤣🤣🤣

底表:

在这里插入图片描述


1. array_contains

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

在这里插入图片描述

  • 判断是否拥有某个技能
SELECT name, array_contains(skills, '龟派气功') AS has_kamehameha
FROM dragon_ball_skills;

在这里插入图片描述

  • 不可传null

在这里插入图片描述

org.apache.spark.sql.AnalysisException: cannot resolve ‘array_contains(dragon_ball_skills.skills, NULL)’ due to data type mismatch: Null typed values cannot be used as arguments;


2. array_size

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

在这里插入图片描述

  • 查看技能数量
SELECT name, array_size(skills) AS skill_count
FROM dragon_ball_skills;

在这里插入图片描述

  • 不可传null
    在这里插入图片描述

3. array_distinct

https://spark.apache.org/docs/latest/api/sql/index.html#array_distinct
在这里插入图片描述

  • 去重技能
SELECT name, array_distinct(skills) AS unique_skills
FROM dragon_ball_skills;

在这里插入图片描述

  • 不可传null

在这里插入图片描述


4. array_sort

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

这个排序函数细节很多,博主会单独出一期讲解。可以在博主主页搜索哈。

在这里插入图片描述

  • 按字母排序技能

在这里插入图片描述


5. array_append / array_prepend

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

在这里插入图片描述

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

在这里插入图片描述

  • 从数组前后加入数据 就不展开讲了

6. array_remove

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

在这里插入图片描述

  • 删除某个技能
SELECT name, array_remove(skills, '龟派气功') AS removed_kamehameha
FROM dragon_ball_skills;

在这里插入图片描述

  • 注意null值的处理

在这里插入图片描述


7. array_union

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

在这里插入图片描述

  • 合并两个技能数组
SELECT array_union(array('龟派气功', '瞬间移动'), array('元气弹')) AS all_skills;

在这里插入图片描述

  • 不可传null

在这里插入图片描述

org.apache.spark.sql.AnalysisException: cannot resolve ‘array_union(array(‘龟派气功’, ‘瞬间移动’), NULL)’ due to data type mismatch:input to function array_union should have been two arrays with same element type, but it's [array<string>, void];

在这里插入图片描述

org.apache.spark.sql.AnalysisException: cannot resolve ‘array_union(NULL, NULL)’ due to data type mismatch: input to function array_union should have been two arrays with same element type, but it's [void, void];


8. array_intersect

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

在这里插入图片描述

  • 查找共同技能

在这里插入图片描述

["龟派气功"]

9. arrays_overlap

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

在这里插入图片描述

arrays_overlap(a1, a2) 

如果数组 a1a2 至少有一个非空元素相同,则返回 true

否则,分情况讨论:

  • 如果两个数组 都没有共同元素
    • 并且两个数组 都不是空数组
      • 其中一个数组含有 NULL,则返回 NULL
    • 否则返回 false

只要两个数组中有一个非空值相同,就返回 true;否则看有没有 NULL,没有就返回 false

使用时要注意处理 NULL` 的情况。


1:有共同元素(非空)

SELECT arrays_overlap(array(1, 2, 3), array(3, 4, 5));
-- 输出: true

在这里插入图片描述

  • 两个数组都有 3,所以返回 true

2:没有共同元素,且都非空,但都没有 NULL

SELECT arrays_overlap(array(1, 2), array(3, 4));
-- 输出: false

在这里插入图片描述

  • 没有交集,也没有 NULL,返回 false

3:没有共同元素,但有一个数组含 NULL

SELECT arrays_overlap(array(1, 2), array(3, NULL));
-- 输出: NULL

在这里插入图片描述

  • 两个数组都不是空的,但没有共同元素,其中一个含有 NULL,所以返回 NULL

4:两个数组都含有 NULL,但没有共同非空元素

SELECT arrays_overlap(array(NULL, 1), array(NULL, 2));
-- 输出: NULL

在这里插入图片描述

  • 虽然都有 NULL,但没有共同的非空元素,所以返回 NULL

5:一个数组为空,另一个有元素

SELECT arrays_overlap(array(), array(1, 2));
-- 输出: false

在这里插入图片描述

  • 空数组和任何数组的交集都是 false

6:两个空数组

SELECT arrays_overlap(array(), array());
-- 输出: false

在这里插入图片描述

  • 两个空数组没有交集,返回 false

  • 判断是否有共同技能
SELECT arrays_overlap(array('龟派气功', '瞬间移动'), array('龟派气功'));

在这里插入图片描述


10. array_join

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

array_join 会将数组中的元素用指定的分隔符连接成一个字符串。
如果数组中有 NULL 值:

  • 没有指定 nullReplacementNULL 被跳过
  • 指定了 nullReplacementNULL 被替换成该字符串

在这里插入图片描述

array_join(array, delimiter[, nullReplacement])
参数类型必须说明
arrayARRAY要连接的数组
delimiterSTRING用于连接数组元素的分隔符(如空格、逗号、顿号等)
nullReplacementSTRING可选参数,用于替换数组中的 NULL 值。如果不传,NULL 值将被忽略(不参与拼接)

1:基础用法(无 NULL)

SELECT array_join(array('kaka', 'luote'), ' ');
-- 输出: "kaka luote"

2:数组中含 NULL,不传 nullReplacement

SELECT array_join(array('kaka', null, 'luote'), ' ');
-- 输出: "kaka luote"
  • NULL 被忽略,不参与拼接。

3:数组中含 NULL,传 nullReplacement

SELECT array_join(array('kaka', null, 'luote'), ' ', '——');
-- 输出: "kaka —— luote"

在这里插入图片描述

  • NULL 被替换为 ——,然后参与拼接。


  • 把技能转为字符串
SELECT name, array_join(skills, '——') AS skill_str
FROM dragon_ball_skills;

在这里插入图片描述


在这里插入图片描述


11. array_max / array_min
  • 获取最大/最小值

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

在这里插入图片描述http://spark.apache.org/docs/latest/api/sql/index.html#array_min

在这里插入图片描述

  • 数组内只有null
    在这里插入图片描述

  • 空数组
    在这里插入图片描述


12. array_position

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

在这里插入图片描述

tips:下标是从1开始的哈~。


  • 查找元素位置
SELECT array_position(array('龟派气功', '瞬间移动'), '瞬间移动'); -- 2

在这里插入图片描述

  • 查找未知数据

在这里插入图片描述


13. arrays_zip

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

在这里插入图片描述

  • 合并多个数组为结构数组
SELECT arrays_zip(array('Math', 'English'), array(90, 85));

在这里插入图片描述


14. array_compact

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

在这里插入图片描述

  • 删除数组中的 NULL 值
SELECT array_compact(array(NULL, '龟派气功', NULL, '瞬间移动')); 
-- ["龟派气功", "瞬间移动"]

15. array_repeat

https://spark.apache.org/docs/latest/api/sql/index.html#array_repeat
在这里插入图片描述

  • 构造重复数组
SELECT array_repeat('龟派气功', 3); -- ["龟派气功", "龟派气功", "龟派气功"]

在这里插入图片描述



16.array_agg

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

把某一列的多个值收集起来,合并成一个数组(保留重复值),结果顺序不确定。

在这里插入图片描述

  • 顺序依赖数据的物理顺序,shuffle 后顺序可能变化—— 每次运行结果可能不同(因为顺序不确定)。

在这里插入图片描述

在这里插入图片描述


http://www.xdnf.cn/news/1210321.html

相关文章:

  • Zynq SOC FPGA嵌入式裸机设计和开发教程自学笔记:GPIO扩展与中断控制技术,万字详解!!
  • 【变更性别】
  • TCPDump实战手册:协议/端口/IP过滤与组合分析指南
  • ESP32学习-1.第一个程序helloworld
  • 子数组和 问题汇总
  • FPGA实现SRIO高速接口与DSP交互,FPGA+DSP异构方案,提供3套工程源码和技术支持
  • Linux_库制作与原理浅理解
  • Python高效历史记录管理:保存最后N个元素的完整指南
  • 【CSS】盒子类型
  • 功率场效应晶体管MOSFET关键指标
  • leaflet中绘制轨迹线的大量轨迹点,解决大量 marker 绑定 tooltip 同时显示导致的性能问题
  • 车载刷写架构 --- 刷写思考扩展
  • Redis的持久化策略-AOF和RDB(详细图解)
  • Java面试宝典:MySQL8新特性底层原理
  • Vue2 vs Vue3:核心差异与升级亮点
  • DeepSeek MoE 技术解析:模型架构、通信优化与负载均衡
  • 飞书 —— 多维表格 —— AI生成
  • 系统学习算法:专题十五 哈希表
  • 数据库02 网页html01 day44
  • 抵御酒店管理系统收银终端篡改攻击 API 加密的好处及实现——仙盟创梦IDE
  • 如何创建一个 Solana 钱包?
  • 文件操作与IO流
  • 如何编写好的测试用例?
  • 泛微E9 引入高版本spring导致webservices接口报错
  • 青少年软件编程图形化Scratch等级考试试卷(四级)2025年6月
  • SpringBoot之起步依赖
  • 在 Web3 时代通过自我主权合规重塑 KYC/AML
  • java导出pdf(使用html)
  • Java:为什么需要通配符捕获(wildcard capture)
  • 【WRF-Chem 实例1】namelist.input 详解- 模拟CO2