apache-spark - 重新分区后引发非确定性结果
问题描述
有什么方法可以在不排序的情况下从数据帧重新分区中获得确定性结果?在下面的代码中,我在执行相同操作时得到不同的结果。
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
解决方案
这种non deterministic
行为是expected
。就是这样...
.repartition(num)
round-robin
当函数内部没有传递任何列时进行重新分区。这并不能保证特定行将始终位于特定分区中。.head(n)
返回数据帧第一个分区的前 n 行。
如果你想要一个订单,你需要使用orderBy
!
推荐阅读
- java - 如何在 JSP 中指向另一个页面?
- php - 带有可选下划线和数字的 PHP 正则表达式
- azure - Azure 组声明返回对象 ID - 需要组名称
- python - 在 python read_csv 执行中处理坏行
- lisp - osicat-posix:stat 冻结
- swift - 如何在 iOS 应用程序上清除/无效环境缓存
- java - akka eventbus - 消息保证 - 发布到总线保证
- sql-server - 基于点位于给定多边形内将多边形表连接到点表时出错
- javascript - 如何使用 javascript 在 chrome OS 上禁用应用程序?
- assembly - 为什么 SHL 在 8086 中“移动”2 个字节?