繁体   English   中英

SPARK:spark-rdd 中 RDD[Array[Int]] 中具有相同索引的元素的总和

[英]SPARK: sum of elements with this same indexes from RDD[Array[Int]] in spark-rdd

我有三个文件,例如:

file1: 1,2,3,4,5
       6,7,8,9,10

file2: 11,12,13,14,15
       16,17,18,19,20

file3: 21,22,23,24,25
       26,27,28,29,30

我必须从每个文件中找到行的总和:

1+2+3+4+5 + 11+12+13+14+15 + 21+21+23+24+25
6+7+8+9+10 + 16+17+18+19+20 + 26+27+28+29+30

我在 spark-scala 中编写了以下代码来获取所有行的总和数组:

val filesRDD = sc.wholeTextFiles("path to folder\\numbers\\*")

// creating  RDD[Array[String]]
val linesRDD = filesRDD.map(elem => elem._2.split("\\n"))

// creating  RDD[Array[Array[Int]]]
val rdd1 = linesRDD.map(line => line.map(str => str.split(",").map(_.trim.toInt)))

// creating  RDD[Array[Int]]
val rdd2 = rdd1.map(elem => elem.map(e => e.sum))

rdd2.collect.foreach(elem => println(elem.mkString(",")))

我得到的 output 是:

15,40
65,90
115,140

我想要的是将 15+65+115 和 40+90+140 相加

任何帮助表示赞赏!

PS:文件可以有不同的编号。 像一些有 3 行其他有 4 行,可以有任何没有。 的文件。

我只想使用 rdds 而不是数据帧来做到这一点。

您可以使用reduce来总结arrays:

val result = rdd2.reduce((x,y) => (x,y).zipped.map(_ + _))

// result: Array[Int] = Array(195, 270)

如果文件的长度不同(例如文件 3 只有一行21,22,23,24,25

val result = rdd2.reduce((x,y) => x.zipAll(y,0,0).map{case (a, b) => a + b})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM