首页 > 解决方案 > 在写入和重新读取镶木地板文件时保留数据帧分区

问题描述

当我将具有已定义分区的数据帧作为镶木地板文件写入磁盘然后再次重新读取镶木地板文件时,分区将丢失。有没有办法在写入和重新读取期间保留数据帧的原始分区?

示例代码

//create a dataframe with 100 partitions and print the number of partitions
val originalDf = spark.sparkContext.parallelize(1 to 10000).toDF().repartition(100)
println("partitions before writing to disk: " + originalDf.rdd.partitions.length)

//write the dataframe to a parquet file and count the number of files actually written to disk
originalDf.write.mode(SaveMode.Overwrite).parquet("tmp/testds")
println("files written to disk: " + new File("tmp/testds").list.size)

//re-read the parquet file into a dataframe and print the number of partitions 
val readDf = spark.read.parquet("tmp/testds")
println("partitions after reading from disk: " + readDf.rdd.partitions.length)

打印出来

partitions before writing to disk: 100
files written to disk: 202
partitions after reading from disk: 4

观察:

有没有办法在读取 parquet 文件后保留数据帧的原始分区而无需repartition(100)再次调用?

背景:在我的实际应用程序中,我编写了许多带有仔细调整分区的不同数据集,我想恢复这些分区,而不必为每个数据帧单独记录分区在将它们写入磁盘时的样子。

我正在使用 Spark 2.3.0。


更新:Spark 2.4.6 和 3.0.0 的结果相同

标签: apache-sparkparquet

解决方案


推荐阅读