spark parallelize(List(1,2,3,4),2)总是按顺序对列表进行分区?

时间:2016-12-01 12:42:36

标签: apache-spark spark-dataframe

我运行下面的代码,结果是37。

val z = sc.parallelize(List(1,2,7,4,30,6), 2)
z.aggregate(0)(math.max(_, _), _ + _)
res40: Int = 37

似乎spark将列表分为2个列表:[1,2,7],[4,30,6]。

然后我改变了列表中的7和4的顺序,我得到了34。

scala> val z = sc.parallelize(List(1,2,4,7,30,6), 2)
z: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[18] at parallelize at <console>:24

scala> z.aggregate(0)(math.max(_, _), _ + _)
res11: Int = 34

我想知道的是,在分区时,spark是否始终保持列表中元素的顺序?

谢谢!

1 个答案:

答案 0 :(得分:2)

这里有两个不同的概念。

  • 使用parallelize并应用不需要改组的转换时仍然存在的项目顺序。
  • 聚合期间未保留且不确定的项目顺序。虽然每个分区按顺序聚合,但合并部分结果的顺序是任意的。

通常不依赖于值和操作的顺序,除非您明确强制执行(例如通过排序)或者您确切知道自己在做什么。