簡體   English   中英

Spark:scala - 如何將集合從RDD轉換為另一個RDD

[英]Spark: scala - how to convert collection from RDD to another RDD

如何將調用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")

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM