Apache spark 按排序顺序将RDD收集到一个节点
我有一个大的RDD,它需要写入磁盘上的单个文件,每个元素一行,这些行按照定义的顺序排序。因此,我考虑对RDD进行排序,在驱动程序中一次收集一个分区,然后附加到输出文件中 两个问题:Apache spark 按排序顺序将RDD收集到一个节点,apache-spark,Apache Spark,我有一个大的RDD,它需要写入磁盘上的单个文件,每个元素一行,这些行按照定义的顺序排序。因此,我考虑对RDD进行排序,在驱动程序中一次收集一个分区,然后附加到输出文件中 两个问题: 在rdd.sortBy()之后,我是否可以保证分区0将包含已排序rdd的第一个元素,分区1将包含已排序rdd的下一个元素,依此类推?(我正在使用默认的分区器。) e、 g 您不能使用saveAsTextFile而不是自己循环和追加吗?saveAsTextFile生成的输出文件数量与分区数量相同。顺便说一句,你的文件
rdd.sortBy()之后,我是否可以保证分区0将包含已排序rdd的第一个元素,分区1将包含已排序rdd的下一个元素,依此类推?(我正在使用默认的分区器。)
e、 g
您不能使用
saveAsTextFile
而不是自己循环和追加吗?saveAsTextFile
生成的输出文件数量与分区数量相同。顺便说一句,你的文件有多大?比任何节点的内存都大。你不能使用saveAsTextFile
而不是自己循环和追加吗?saveAsTextFile
生成的输出文件与分区的数量一样多。顺便说一句,你的文件有多大?比任何节点的内存都大。
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
}
}
val rdd = ???
val sortedRdd = rdd.sortBy(???)
for (e <- sortedRdd.toLocalIterator) {
// Append element e to file
}