我有一个大的RDD,需要写入磁盘上的单个文件,每个元素一行,这些行按照一定的顺序排序。所以我在考虑对RDD进行排序,在驱动程序中一次收集一个分区,然后附加到输出文件。
几个问题:
在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
}
}
我知道rdd.toLocalIterator
是一种更有效的方法,一次一个地获取所有分区。同样的问题:我是否按.sortBy()
给出的顺序获取元素?
val rdd = ???
val sortedRdd = rdd.sortBy(???)
for (e <- sortedRdd.toLocalIterator) {
// Append element e to file
}