You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

流数据中Unnest数组元素聚合:求单对象数组最大值

处理流中单条记录内数组的最大值问题

你需要的是单条记录内部的数组最大值计算,不需要跨多条流记录做聚合,所以GROUP BY这种跨记录的聚合方式完全没必要,反而会带来不必要的状态维护开销。而直接在SELECT里用UNNEST报错,是因为不少流处理SQL引擎(比如Flink SQL)不支持在SELECT子句中直接用UNNEST做这种单记录内的数组处理。

最轻量化的解决方案是用用户自定义函数(UDF),在单条记录层面完成数组最大值的提取,全程不需要维护跨记录状态:

  1. 编写Scalar UDF,专门处理每条记录里的ranks数组:
import org.apache.flink.table.functions.ScalarFunction;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class ArrayMaxRank extends ScalarFunction {
    public Integer eval(List<Map<String, Integer>> ranks) {
        if (ranks == null || ranks.isEmpty()) {
            return null;
        }
        return ranks.stream()
                .map(rankObj -> rankObj.get("rank"))
                .filter(Objects::nonNull)
                .max(Integer::compare)
                .orElse(null);
    }
}
  1. 注册UDF后,直接在SQL中调用:
SELECT 
    name,
    ArrayMaxRank(ranks) AS maxRank
FROM your_stream_table

这样就能直接对每条输入记录计算ranks数组的最大值,输出你期望的{"name": "Dhruv", "maxRank": 2}格式结果,完全不需要UNNEST或GROUP BY,也不会产生额外的状态开销。

如果是其他流处理框架(比如KSQL、Spark Streaming SQL),思路完全一致:创建一个处理单条记录内数组的UDF,在SELECT语句中直接调用即可。

内容的提问来源于stack exchange,提问作者Dhruv Jagetiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:52:37