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

Spark Scala中数组列求和与占比计算的UDF需求及实现问题

解决嵌套数组的标识求和与占比计算问题

我来帮你完善这段Scala代码,实现你需要的相同标识数值求和、以及占比计算的需求~

需求回顾

  • 输入数据:Array(Array("a:25","a:30","b:30"),Array("a:25","a:30","b:30"))
  • 核心目标:
    1. 对相同标识(如a、b)的数值求和
    2. 计算每个标识的数值占总合的比例

完整实现代码

val input = Array(Array("a:25","a:30","b:30"),Array("a:25","a:30","b:30"))

// 1. 展平嵌套数组,拆分每个元素为(标识, 数值)元组
val keyValuePairs = input.flatMap(_.map { item =>
  val Array(key, valueStr) = item.split(":") // 模式匹配拆分,避免索引越界风险
  (key, valueStr.toDouble)
})

// 2. 按标识分组并计算总和
val sumByKey = keyValuePairs.groupBy(_._1).mapValues(_.map(_._2).sum)

// 3. 计算总合,再推导各标识的占比
val totalSum = sumByKey.values.sum
val ratioByKey = sumByKey.map { case (key, sum) =>
  (key, sum / totalSum)
}

// 输出结果
println("各标识求和结果:")
sumByKey.foreach { case (k, v) => println(s"$k: $v") }
println("\n各标识占比结果(保留两位小数):")
ratioByKey.foreach { case (k, v) => println(s"$k: ${v.formatted("%.2f")}") }

代码说明

  • 展平与拆分:用flatMap把二维数组转成一维,再通过模式匹配拆分每个key:value格式的字符串,相比直接用索引y(0)、y(1),模式匹配能避免拆分后数组长度不符的异常,更安全。
  • 分组求和:groupBy(_._1)按标识分组,mapValues(_.map(_._2).sum)对每组的数值做求和操作,得到每个标识的总数值(比如a:110、b:60)。
  • 占比计算:先算出所有标识的数值总和,再遍历求和结果,用每个标识的总和除以总合得到占比,最后用formatted("%.2f")格式化输出,让结果更易读。

运行结果

各标识求和结果:
a: 110.0
b: 60.0

各标识占比结果(保留两位小数):
a: 0.65
b: 0.35

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:47:06