如果我有一个文件,并且每行做了一个 RDD zipWithIndex,
([row1, id1001, name, address], 0)
([row2, id1001, name, address], 1)
...
([row100000, id1001, name, address], 100000)
如果重新加载文件,我能否获得相同的索引顺序?由于它是并行运行的,其他行可能会以不同的方式进行分区?
RDD
s 可以排序,因此也有顺序。该命令用于创建索引.zipWithIndex()
.
每次获得相同的顺序取决于之前的调用在程序中执行的操作。文档提到.groupBy()
可以破坏顺序或生成不同的顺序。可能还有其他调用也执行此操作。
我想你可以随时打电话.sortBy()
打电话之前.zipWithIndex()
如果您需要保证特定的订购。
这在.zipWithIndex() scala API docs https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/rdd/RDD.html#zipWithIndex()
public RDD<scala.Tuple2<T,Object>> zipWithIndex()
压缩这个 RDD
其元素索引。排序首先基于分区
索引,然后是每个分区内项目的排序。所以
第一个分区中的第一个项目的索引为 0,最后一个项目的索引为 0
最后一个分区接收最大的索引。这类似于
Scala 的 zipWithIndex 但它使用 Long 而不是 Int 作为索引
类型。当此RDD包含时,该方法需要触发spark作业
多个分区。
请注意,某些 RDD(例如 groupBy() 返回的 RDD)不会
保证分区中元素的顺序。分配给每个的索引
因此,元素是不能保证的,如果 RDD 是这样的,甚至可能会改变
重新评估。如果需要固定顺序来保证相同
索引分配,您应该使用 sortByKey() 对 RDD 进行排序或保存它
到一个文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)