微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有三个文件,例如:

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 行,可以有任何没有。文件

我只想使用 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).map{case (a,b) => a + b})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。