Spark zipWithIndex安全并行实现吗?

时间:2015-08-06 03:16:38

标签: scala apache-spark

如果我有一个文件,并且每行都有一个RDD zipWithIndex,

([row1, id1001, name, address], 0)
([row2, id1001, name, address], 1)
...
([row100000, id1001, name, address], 100000)

如果我重新加载文件,是否可以获得相同的索引顺序?由于它并行运行,其他行可能会以不同方式划分?

1 个答案:

答案 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进行排序或保存   到文件。