如何用Spark SQL反转数组元素并保留末尾空值?
Spark SQL实现数组非空元素反转并保留末尾Null
需求与示例
输入数据:
Key data a [5,2,6,null,null] b [5,7,9,4,null,null,null]
期望输出:
Key data a [6,2,5,null,null] b [4,9,7,5,null,null,null]
核心要求:仅反转数组中的非空元素,保持原数组末尾的null位置和数量完全不变。
实现查询语句
假设你的源表名为your_table_name,执行以下Spark SQL即可得到目标结果:
WITH temp_process AS ( SELECT key, data, -- 提取数组中所有非空元素 filter(data, elem -> elem IS NOT NULL) AS non_null_vals, -- 计算原数组末尾的null总数 size(data) - size(filter(data, elem -> elem IS NOT NULL)) AS trailing_null_cnt FROM your_table_name ) SELECT key, -- 反转非空元素后拼接对应数量的null concat(reverse(non_null_vals), array_repeat(null, trailing_null_cnt)) AS data FROM temp_process;
逻辑说明
- 提取非空元素:通过
filter函数筛选出数组中所有非null的元素,得到纯有效值数组 - 统计末尾null数量:用原数组长度减去非空元素数组的长度,得到原数组末尾的
null个数 - 反转非空数组:使用
reverse函数反转非空元素数组 - 拼接null数组:用
array_repeat生成对应数量的null数组,再通过concat将反转后的有效值数组与null数组合并,还原原数组的长度结构
内容的提问来源于stack exchange,提问作者user20998231
相关产品推荐
相关产品推荐

