首页 / 聚合
聚合函数对照
聚合函数在 MaxCompute、Hologres、StarRocks、Doris、Hive、Spark SQL、Flink SQL 中的写法对照,共 7 个函数。其中 7 个函数在部分引擎中需要改写或没有对应函数。
目录:any_value · approx_count_distinct · collect_list · collect_set · max_by · percentile_approx · wm_concat
ANY_VALUE 取组内任意值
ANY_VALUE 从每组中任取一个值,常用于 GROUP BY 时带出不参与分组、但组内都一样的列。结果不确定,各引擎对 NULL 的处理也不同。Hologres、Hive 和 Flink 没有这个函数。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | ANY_VALUE(colname) |
| Hologres | 需改写 | MAX(col) |
| StarRocks | 支持 | ANY_VALUE(expr) |
| Doris | 支持 | ANY_VALUE(expr) |
| Hive | 需改写 | max(col) |
| Spark SQL | 支持 | any_value(expr[, isIgnoreNull]) |
| Flink SQL | 需改写 | FIRST_VALUE(expression) |
APPROX_COUNT_DISTINCT 近似去重计数
APPROX_COUNT_DISTINCT 用 HyperLogLog 等算法估算去重个数,比 COUNT(DISTINCT) 省内存。Hologres、StarRocks、Doris 和 Spark 同名可用,MaxCompute 叫 APPROX_DISTINCT,Hive 和 Flink 没有内置的近似去重函数,只能用精确的 COUNT(DISTINCT)。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 别名 | APPROX_DISTINCT(colname) |
| Hologres | 支持 | APPROX_COUNT_DISTINCT(column) |
| StarRocks | 支持 | APPROX_COUNT_DISTINCT(expr) |
| Doris | 支持 | APPROX_COUNT_DISTINCT(expr) |
| Hive | 需改写 | COUNT(DISTINCT col) |
| Spark SQL | 支持 | approx_count_distinct(expr[, relativeSD]) |
| Flink SQL | 需改写 | COUNT(DISTINCT expr) |
COLLECT_LIST 聚合为数组
COLLECT_LIST 把一组值按原样聚合成数组,保留重复值。MaxCompute、Doris、Hive 和 Spark 同名可用,其他引擎改写为 ARRAY_AGG。各引擎都不保证元素顺序,StarRocks 3.0 起可以在 ARRAY_AGG 中写 ORDER BY。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | COLLECT_LIST(colname) |
| Hologres | 需改写 | ARRAY_AGG(expression) |
| StarRocks | 需改写 | ARRAY_AGG(col [ORDER BY ...]) |
| Doris | 支持 | COLLECT_LIST(expr[, max_size]) |
| Hive | 支持 | collect_list(col) |
| Spark SQL | 支持 | collect_list(expr) |
| Flink SQL | 需改写 | ARRAY_AGG(expression) |
COLLECT_SET 去重聚合为数组
COLLECT_SET 把一组值去重后聚合成数组。MaxCompute、Doris、Hive 和 Spark 同名可用,Hologres、StarRocks 和 Flink 要改写为 ARRAY_AGG(DISTINCT ...)。各引擎都不保证数组元素的顺序。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | COLLECT_SET(colname) |
| Hologres | 需改写 | ARRAY_AGG(DISTINCT expression) |
| StarRocks | 需改写 | ARRAY_AGG(DISTINCT col) |
| Doris | 支持 | COLLECT_SET(expr[, max_size]) |
| Hive | 支持 | collect_set(col) |
| Spark SQL | 支持 | collect_set(expr) |
| Flink SQL | 需改写 | ARRAY_AGG(DISTINCT expression) |
MAX_BY 取最大值对应的列
MAX_BY(x, y) 返回 y 最大的那一行的 x,例如“每个用户最近一次下单的门店”。MaxCompute、Hologres、StarRocks、Doris 和 Spark 都支持;Hive 和 Flink 没有,要用 ROW_NUMBER 窗口函数改写。y 相同时返回哪一行不确定。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | MAX_BY(valueToReturn, valueToMaximize) |
| Hologres | 支持 | MAX_BY(x, y) |
| StarRocks | 支持 | max_by(x, y) |
| Doris | 支持 | MAX_BY(expr1, expr2) |
| Hive | 需改写 | ROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1 |
| Spark SQL | 支持 | max_by(x, y[, k]) |
| Flink SQL | 需改写 | ROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1 |
PERCENTILE_APPROX 近似分位数
PERCENTILE_APPROX 计算近似分位数,常用于 P50、P99 这类指标。MaxCompute、StarRocks、Doris、Hive 和 Spark 同名可用,但第三个参数的含义和取值范围不同。Hologres 要用 APPROX_PERCENTILE ... WITHIN GROUP 改写,Flink 较新版本只有精确的 PERCENTILE。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | PERCENTILE_APPROX(col[, weight], p[, B]) |
| Hologres | 需改写 | APPROX_PERCENTILE(p) WITHIN GROUP (ORDER BY col) |
| StarRocks | 支持 | PERCENTILE_APPROX(expr, p[, compression]) |
| Doris | 支持 | PERCENTILE_APPROX(col, p[, compression]) |
| Hive | 支持 | percentile_approx(col, p[, B]) |
| Spark SQL | 支持 | percentile_approx(col, percentage[, accuracy]) |
| Flink SQL | 需改写 | PERCENTILE(expr, percentage[, frequency]) |
WM_CONCAT 分组拼接字符串
WM_CONCAT 是 MaxCompute 的分组字符串拼接函数,分隔符写在前面。迁到其他引擎时要换函数名,并注意分隔符的位置:Hologres 用 STRING_AGG,StarRocks 和 Doris 用 GROUP_CONCAT,Flink 用 LISTAGG。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | WM_CONCAT(separator, colname) |
| Hologres | 需改写 | STRING_AGG(expression, delimiter) |
| StarRocks | 需改写 | GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR sep]) |
| Doris | 需改写 | GROUP_CONCAT([DISTINCT] str[, sep] [ORDER BY ...]) |
| Hive | 需改写 | concat_ws(',', collect_list(col)) |
| Spark SQL | 需改写 | string_agg(expr[, delimiter]) WITHIN GROUP (ORDER BY ...) |
| Flink SQL | 需改写 | LISTAGG(expression[, separator]) |