如何将调用take(5)
后返回的集合转换为另一个RDD,这样我可以在输出文件中保存前5条记录?
如果我使用saveAsTextfile
,则不允许我一起使用take
和saveAsTextFile
(这就是为什么您会看到下面注释的那一行)。它按排序顺序存储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")
答案 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))