我正在尝试在 databricks 上生成大型数据框的随机排序版本。
我的首选代码是在数据帧上使用
.orderBy(rand())
。
然而,这似乎经常触发 SparkException:
SparkException: Job aborted due to stage failure: Total size of serialized results of 36 tasks (1038.9 MiB) is bigger than spark.driver.maxResultSize 1024.0 MiB.
在尝试了但是之后,我发现如果我使用repartition(10)
或类似的东西减少分区数量
,错误就会消失。这对我来说是
违反直觉,因为我预计减少分区数量会增加通过网络传输的每个块的大小,从而使序列化结果的大小变得更大?
有人可以解释为什么情况并非如此吗?
// BOOM
display(my_df
.orderBy(rand()))
// WORKS FINE
display(my_df
.repartition(10)
.orderBy(rand()))
PS.:我的DF中原来的分区数量是662
。这是直接从 S3 存储桶读取的 Parquet 文件P.S.2:在 Databricks 上运行 Spark3.3.0 和 Scala 2.12!
spark docs进行序列化,如果您有很多分区,则每条消息都会有额外的信息要发送。
您将分区从 622 减少到 10,并且随之发送的所有元数据也减少了。想象一下,您必须发送 622 * 50(列元数据),现在您正在发送 10 * 50(列元数据)。