[英]Spark: scala - how to convert collection from RDD to another RDD
如何將調用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")
val rowsArray: Array[Row] = rdd.take(5)
val slicedRdd = sparkContext.parallelize(rowsArray, 1)
slicedRdd.savesTextFile("specify path here")
除非你絕對需要saveAsTextFile
格式,否則我只需使用簡單的IO(如File
)將take(5)
輸出打印到文件中。
否則,這里只是羅嗦的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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.