首页 > 解决方案 > 重新分区后引发非确定性结果

问题描述

有什么方法可以在不排序的情况下从数据帧重新分区中获得确定性结果?在下面的代码中,我在执行相同操作时得到不同的结果。

from pyspark.sql.functions import rand, randn
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.range(0, 100000)

# repartition dataframe to 5 partitions
df2 = df.repartition(5).persist()
df2.head(5)

Out[1]: [Row(id=5324), Row(id=5389), Row(id=6209), Row(id=7640), Row(id=8090)]

df2.unpersist()
df3 = df.repartition(5).persist()
df3.head(5)

Out[2]: [Row(id=1019), Row(id=652), Row(id=2287), Row(id=470), Row(id=1348)]

火花版本 - 2.4.5

标签: apache-sparkpyspark

解决方案


这种non deterministic行为是expected。就是这样...

  1. .repartition(num)round-robin当函数内部没有传递任何列时进行重新分区。这并不能保证特定行将始终位于特定分区中。

  2. .head(n)返回数据帧第一个分区的前 n 行。

如果你想要一个订单,你需要使用orderBy


推荐阅读