Apache Doris 中的 FOREACH 组合器:数组聚合函数详解
2025-06-27 06:51:49作者:宣聪麟
什么是 FOREACH 组合器
在 Apache Doris 中,FOREACH 是一种强大的函数组合器,它能够将原本用于表数据的聚合函数转换为处理数组数据的版本。简单来说,它允许我们对数组中对应位置的元素进行聚合运算,最终返回一个包含聚合结果的数组。
核心功能
FOREACH 组合器的主要功能是对多个数组的对应元素进行聚合计算。例如:
- 当你有三个数组 [1, 2]、[3, 4, 5] 和 [6, 7]
- 使用 sum_foreach 函数会对第一个元素(1+3+6=10)、第二个元素(2+4+7=13)和第三个元素(5)分别求和
- 最终返回结果数组 [10, 13, 5]
基本语法
FOREACH 组合器的通用语法格式为:
AGGREGATE_FUNCTION_FOREACH(arg...)
其中 AGGREGATE_FUNCTION 可以是任何标准的聚合函数,如 sum、count、avg 等。
实际应用示例
数据准备
假设我们有一个测试表 db,包含以下数据:
| a (数组类型) | s (数组类型) |
|---|---|
| [1, 2, 3] | ["ab", "123"] |
| [20] | ["cd"] |
| [100] | ["efg"] |
| NULL | NULL |
| [null, 2] | [null, "c"] |
1. 数值数组求和
SELECT sum_foreach(a) FROM db;
结果:
[121, 4, 3]
解释:
- 第一个位置:1 + 20 + 100 + null = 121
- 第二个位置:2 + 2 = 4
- 第三个位置:3 = 3
2. 字符串数组计数
SELECT count_foreach(s) FROM db;
结果:
[3, 2]
解释:
- 第一个位置:统计了 "ab", "cd", "efg", null → 3个非null值
- 第二个位置:统计了 "123", "c" → 2个非null值
3. 数组元素聚合
SELECT array_agg_foreach(a) FROM db;
结果:
[[1, 20, 100, null], [2, 2], [3]]
解释:
- 将每个数组的第一个元素聚合成新数组 [1, 20, 100, null]
- 将每个数组的第二个元素聚合成新数组 [2, 2]
- 将每个数组的第三个元素聚合成新数组 [3]
4. 键值对映射
SELECT map_agg_foreach(a, a) FROM db;
结果:
[{1:1, 20:20, 100:100}, {2:2}, {3:3}]
解释:
- 为每个数组位置创建键值对映射
- 第一个位置:1→1, 20→20, 100→100
- 第二个位置:2→2
- 第三个位置:3→3
适用场景
FOREACH 组合器特别适合处理以下场景:
- 时间序列分析:当需要按时间维度聚合多个指标时
- 多维数据分析:对多个维度的数据进行并行计算
- 数组数据处理:需要对数组结构进行聚合运算的场景
- 数据透视:将行数据转换为列式聚合结果
注意事项
- 处理包含 NULL 值的数组时,大多数聚合函数会忽略 NULL 值
- 不同长度的数组聚合时,结果数组长度以最长输入数组为准
- 对于较短数组中不存在的元素位置,不会参与聚合计算
- 性能考虑:对于大型数组,聚合操作可能会消耗较多资源
总结
Apache Doris 的 FOREACH 组合器为数组数据的聚合分析提供了强大而灵活的工具。通过将传统聚合函数扩展为数组版本,开发者能够以更简洁高效的方式处理复杂的多维数据聚合需求。无论是简单的求和计数,还是复杂的数组操作,FOREACH 组合器都能提供优雅的解决方案。
登录后查看全文
热门项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0265
GLM-5.2智谱开源 GLM-5.2,这是针对长文本任务的最新旗舰模型。相较于前代产品 GLM-5.1,它在长文本任务处理能力上实现了显著飞跃,并且首次在稳定的 100 万 token 上下文中提供这一能力。Jinja00
JoyAI-VL-Interaction-Preview京东开源首个开源、视觉驱动的实时交互模型——它能实时监控视频流,并自主决定何时发言、保持沉默或委托任务。Jinja00
cann-learning-hubCANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。Jupyter Notebook0186
MaxKB强大易用的开源企业级智能体平台Python02
note-gen一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。TSX011
项目优选
收起
暂无描述
Dockerfile
788
5.18 K
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
900
2.1 K
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
722
1.45 K
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.14 K
1.18 K
deepin linux kernel
C
32
16
Ascend Extension for PyTorch
Python
768
997
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
473
483
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
2.51 K
692
CANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。
Python
1.08 K
686
本仓库是 Flutter SDK 与 Flutter Engine 的 OpenHarmony 适配版本,由 CPF-Flutter 团队维护。开发者可使用熟悉的 Flutter 技术栈开发 OpenHarmony 应用,3.35.7 及以后的适配版本可基于本仓库源码构建支持 OpenHarmony 的 Flutter Engine。
Dart
1.05 K
277