Scala SPARK:SPARK RDD中RDD[Array[Int]]中具有相同索引的元素之和
我有三个文件,如:Scala SPARK:SPARK RDD中RDD[Array[Int]]中具有相同索引的元素之和,scala,apache-spark,rdd,Scala,Apache 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
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(",")))
我得到的结果是:
15,40
65,90
115,140
我想要的是求和15+65+115和40+90+140
感谢您的帮助
附言:
文件可以有不同的行数,有些行有3行,有些行有4行,可以有任意数量的文件。
我只想使用RDD而不是数据帧来实现这一点。您可以使用
reduce
来总结数组:
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})