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

如何在Java Spark中聚合数组类型Map以汇总金额与计数

解决方案

实现思路

要完成数组内Map的金额汇总,需先拆分数组中的单个Map元素,再对对应键的值求和,最后将结果重新组装成目标Map。

代码实现(Spark Java API)

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import static org.apache.spark.sql.functions.*;

// 1. 拆分数组,将每个Map元素转为单独行
Dataset<Row> explodedDF = events.select(explode(col("totalAmounts")).alias("amountMap"));

// 2. 提取Map中两个金额字段,聚合求和
Dataset<Row> sumDF = explodedDF.agg(
    sum(col("amountMap").getItem("totalCreditAmount")).alias("totalCreditAmount"),
    sum(col("amountMap").getItem("totalDebitAmount")).alias("totalDebitAmount")
);

// 3. 将求和结果组装成目标Map
Dataset<Row> resultDF = sumDF.select(
    map(
        lit("totalCreditAmount"), col("totalCreditAmount"),
        lit("totalDebitAmount"), col("totalDebitAmount")
    ).alias("aggregatedAmounts")
);

// 获取最终结果
resultDF.collectAsList();

代码说明

  • explode(col("totalAmounts")):把数组类型的totalAmounts拆分为多行,每行对应一个独立的Map元素。
  • sum(col("amountMap").getItem("key")):从每个Map中提取指定键的值,对所有值执行求和操作。
  • map(lit("key"), col("value"), ...):将求和后的两个字段重新组合成一个Map对象。

执行后会得到你期望的结果:

[
    Map(totalCreditAmount -> 60, totalDebitAmount -> 150)
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:32:10