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(",")))
我得到的输出是:
15,40
65,90
115,140
我想要的是求和15+65+115和40+90+140
感谢任何帮助!
PS:
文件可以有不同的编号。一些线像一些有 3 条线,其他有 4 条线,并且可以没有。文件数。
我只想使用 rdds 而不是数据帧来做到这一点。
你可以用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})
我有三个文件,例如:
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
感谢任何帮助!
PS: 文件可以有不同的编号。一些线像一些有 3 条线,其他有 4 条线,并且可以没有。文件数。
我只想使用 rdds 而不是数据帧来做到这一点。
你可以用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})