reduce:归约数组元素
速查结论
reduce(expr, start, merge, finish) 是 Spark SQL 中用于将数组中所有元素通过二元运算符逐步归约为单一结果的函数。
语法
reduce(expr, start, merge [, finish])
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| expr | ARRAY | 要归约的输入数组 |
| start | 任意类型 | 归约的初始状态值 |
| merge | LAMBDA | 合并函数,接受 (accumulator, element) 两个参数,将当前累积值与数组元素合并,返回新的累积值 |
| finish | LAMBDA(可选) | 完成函数,接受最终的累积值作为参数,返回转换后的最终结果 |
返回值
将 merge 函数依次应用于初始值 start 和数组中的每个元素,得到最终累积值。如果提供了 finish 函数,则将 finish 应用于最终累积值,返回转换后的结果。
示例
> SELECT reduce(array(1, 2, 3), 0, (acc, x) -> acc + x);
6
> SELECT reduce(array(1, 2, 3), 0, (acc, x) -> acc + x, acc -> acc * 10);
60
常见报错与避坑指南
- null 数组处理:如果输入数组为 null,函数返回 null,而非初始值 start。如果需要安全处理,使用
COALESCE(reduce(arr, ...), start)。 - null 元素在 merge 中:如果数组包含 null 元素,merge 函数需要能够处理 null 输入,否则归约可能中断或返回 null。建议在 merge 中做好 null 防御性处理。
- 归约顺序从左到右:
reduce从数组的第一个元素到最后一个元素依次应用 merge 函数,而非并行归约。依赖结合律的运算(如加法、乘法)结果不受顺序影响,但不满足结合律的运算需注意顺序。
Since: 3.4.0
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
