按排序顺序将RDD收集到一个节点

时间:2016-02-10 00:23:07

标签: apache-spark

我有一个大的RDD,需要写入磁盘上的单个文件,每个元素一行,这些行按照一定的顺序排序。所以我在考虑对RDD进行排序,在驱动程序中一次收集一个分区,然后附加到输出文件。

几个问题:

  1. rdd.sortBy()之后,我是否保证分区0将包含已排序RDD的第一个元素,分区1将包含已排序RDD的下一个元素,依此类推? (我使用默认分区程序。) e.g。

    val rdd = ???
    val sortedRdd = rdd.sortBy(???)
    for (p <- sortedRdd.partitions) {
      val index = p.index
      val partitionRdd = sortedRdd mapPartitionsWithIndex { case (i, values) => if (i == index) values else Iterator() }
      val partition = partitionRdd.collect()
      partition foreach { e =>
        // Append element e to file
      }
    }
    
  2. 我知道rdd.toLocalIterator是一种更有效的方法,一次一个地获取所有分区。同样的问题:我是否按.sortBy()给出的顺序获取元素?

    val rdd = ???
    val sortedRdd = rdd.sortBy(???)
    for (e <- sortedRdd.toLocalIterator) {
      // Append element e to file
    }
    

0 个答案:

没有答案