如何在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
相关产品推荐
相关产品推荐

