Spark Scala中数组列求和与占比计算的UDF需求及实现问题
解决嵌套数组的标识求和与占比计算问题
我来帮你完善这段Scala代码,实现你需要的相同标识数值求和、以及占比计算的需求~
需求回顾
- 输入数据:
Array(Array("a:25","a:30","b:30"),Array("a:25","a:30","b:30")) - 核心目标:
- 对相同标识(如
a、b)的数值求和 - 计算每个标识的数值占总合的比例
- 对相同标识(如
完整实现代码
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
相关产品推荐
相关产品推荐

