如果我有一个文件,并且每行都有一个RDD zipWithIndex,
([row1, id1001, name, address], 0)
([row2, id1001, name, address], 1)
...
([row100000, id1001, name, address], 100000)
如果我重新加载文件,是否可以获得相同的索引顺序?由于它并行运行,其他行可能会以不同方式划分?
答案 0 :(得分:7)
RDD
可以排序,也可以排序。此订单用于创建.zipWithIndex()
的索引。
每次获得相同的顺序取决于之前的调用在您的程序中执行的操作。文档提到.groupBy()
可以破坏顺序或生成不同的顺序。可能还有其他调用也可以执行此操作。
如果您需要保证特定订购,我想您可以在致电.sortBy()
之前致电.zipWithIndex()
。
.zipWithIndex() scala API docs
public RDD<scala.Tuple2<T,Object>> zipWithIndex()
将此RDD拉出来 其元素指数。排序首先基于分区 index,然后是每个分区中项目的顺序。所以 第一个分区中的第一个项目获取索引0,最后一个项目位于 最后一个分区接收最大的索引。这类似于 Scala的zipWithIndex但它使用Long而不是Int作为索引 类型。当此RDD包含时,此方法需要触发spark作业 不止一个分区。请注意,某些RDD(例如groupBy()返回的RDD)不会 保证分区中元素的顺序。分配给每个的索引 因此,不保证元素,如果RDD,甚至可能会改变 重新评估。如果需要固定订购以保证相同 索引分配,您应该使用sortByKey()对RDD进行排序或保存 到文件。