我正在尝试存储已经在特定字段(具有10亿个值)上重新分区的数据框。 目标是避免再次读取时重新分区,因为它将在需要将该字段重新分区的多个应用程序中读取(因为它们在该字段上具有大量的窗口功能)
df_repartitioned = df_input.repartition(10000,field)
df_repartitioned.write.parquet(path)
但是,一旦我再次阅读它,要利用分区器,我需要再次对其重新分区。我的策略是现在不再需要在写入之前用于重新分区的所有资源。
df_stored = spark.read.parquet(path)
df_stored_partitioner = df_stored.repartition(10000,field).persist()
df_stored_partitioner.count()
理想情况下,混洗时间将是最短的,因为它已经正确分区了。 不幸的是,它崩溃了
org.apache.spark.shuffle.FetchFailedException:java.lang.UnsupportedOperationException
如果我用较少的分区(例如5000)重新分区,它仍然会崩溃,但是如果使用更多的分区(例如20000),它将起作用,但这实际上意味着完全重新分区,这正是我要避免的事情。
>有人知道一种实现我想要的方式的方法,即存储分区的数据帧并避免在读取后重新分区吗?