Spark:scala - 如何将集合从RDD转换为另一个RDD

时间:2016-06-13 02:03:04

标签: scala hadoop apache-spark bigdata

如何将调用take(5)后返回的集合转换为另一个RDD,这样我可以在输出文件中保存前5条记录?

如果我使用saveAsTextfile,则不允许我一起使用takesaveAsTextFile(这就是为什么您会看到下面注释的那一行)。它按排序顺序存储RDD中的所有记录,因此前5个记录是前5个国家,但我只想存储前5个记录 - 是否可以在RDD中转换集合[take(5)]?

val Strips =  txtFileLines.map(_.split(","))
                         .map(line => (line(0) + "," + (line(7).toInt + line(8).toInt)))
                         .sortBy(x => x.split(",")(1).trim().toInt, ascending=false)
                         .take(5)
                       //.saveAsTextFile("output\\country\\byStripsBar")

解决方案: sc.parallelize(Strips, 1).saveAsTextFile("output\\country\\byStripsBar")

2 个答案:

答案 0 :(得分:2)

val rowsArray: Array[Row] = rdd.take(5)
val slicedRdd = sparkContext.parallelize(rowsArray, 1)

slicedRdd.savesTextFile("specify path here")

答案 1 :(得分:1)

除非您绝对需要saveAsTextFile格式化,否则我只需使用简单的IO(如take(5))将File输出打印到文件中。

否则,这里只是罗嗦的RDD解决方案:

scala> val rdd = sc.parallelize(5 to 1 by -1 map{x => (x, x*x)})
rdd: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[71] at parallelize at <console>:27

scala> rdd.collect
res1: Array[(Int, Int)] = Array((5,25), (4,16), (3,9), (2,4), (1,1))

scala> val top2 = rdd.sortBy(_._1).zipWithIndex.collect{case x if (x._2 < 2) => x._1}
top2: org.apache.spark.rdd.RDD[(Int, Int)] = MapPartitionsRDD[79] at collect at <console>:29

scala> top2.collect
res2: Array[(Int, Int)] = Array((1,1), (2,4))