首页
/ Apache Doris 中的 FOREACH 组合器:数组聚合函数详解

Apache Doris 中的 FOREACH 组合器:数组聚合函数详解

2025-06-27 09:59:37作者:宣聪麟

什么是 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 组合器特别适合处理以下场景:

  1. 时间序列分析:当需要按时间维度聚合多个指标时
  2. 多维数据分析:对多个维度的数据进行并行计算
  3. 数组数据处理:需要对数组结构进行聚合运算的场景
  4. 数据透视:将行数据转换为列式聚合结果

注意事项

  1. 处理包含 NULL 值的数组时,大多数聚合函数会忽略 NULL 值
  2. 不同长度的数组聚合时,结果数组长度以最长输入数组为准
  3. 对于较短数组中不存在的元素位置,不会参与聚合计算
  4. 性能考虑:对于大型数组,聚合操作可能会消耗较多资源

总结

Apache Doris 的 FOREACH 组合器为数组数据的聚合分析提供了强大而灵活的工具。通过将传统聚合函数扩展为数组版本,开发者能够以更简洁高效的方式处理复杂的多维数据聚合需求。无论是简单的求和计数,还是复杂的数组操作,FOREACH 组合器都能提供优雅的解决方案。

登录后查看全文
热门项目推荐