Когда я записываю фрейм данных с определенным разделением на диск в виде файла паркета, а затем снова перечитываю файл паркета, разделение теряется. Есть ли способ сохранить первоначальное разбиение кадра данных во время записи и повторного чтения?
Пример кода
//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
Замечания:
- Первое число - ожидаемый результат, кадр данных состоит из 100 разделов
- Второе число также выглядит хорошо для меня: я получаю 100
*.parquet
файлов, 100 *.parquet.crc
файлов и два _SUCCESS
файла, поэтому файл паркета по-прежнему состоит из 100 разделов
- Третья строка показывает, что после повторного чтения файла паркета исходное разбиение теряется, а количество разделов после чтения файла паркета изменяется. Количество разделов связано с количеством исполнителей моего кластера Spark
- Результаты одинаковы, независимо от того, пишу ли я файл паркета на локальный диск или в хранилище Hdfs
- Когда я запускаю действие на
readDf
, я вижу в SparkUI, что создаются четыре задачи, при вызове foreachPartition
на readDf
функция выполняется четыре раза
Есть ли способ сохранить исходное разбиение кадра данных без повторного вызова repartition(100)
после чтения файла паркета?
Справочная информация : в моем реальном приложении я пишу множество различных наборов данных с тщательно настроенными разделами, и я хотел бы восстановить эти разделы без необходимости индивидуальной записи для каждого кадра данных, как выглядели разделы при их записи на диск.
Я использую Spark 2.3.0.