У меня странная проблема при попытке сохранить кадр данных в файл паркета в HDFS при установке следующей опции конфигурации свечи spark.sql.sources.partitionOverwriteMode=dynamic
. Некоторые замечания о том, что я пытаюсь сделать:
- Я записываю непустой фрейм данных в новый каталог (я уверен на 100%, что в фрейме данных есть данные)
- Мои данные имеет два уровня разделения (первый - это дата события, второй - дата обработки)
Проблема в том, что если я запускаю свой код в пустом каталоге, никакие данные не записываются в каталог :(. Я убедился, что перед записью в DataFrame действительно есть данные, поэтому я уверен, что это не пустая проблема DataFrame.
Вот мой код, который фактически записывает данные:
val outputDf = someDf.repartition("event_dt","processing_dt")
val writer = outputDf.write
writer.partitionBy("event_dt","processing_dt")
writer.mode("Overwrite")
writer.parquet(outputPath)
// I also tried the below version using .save incase it changed anything, but it didn't
// val outputDf = someDf.repartition("event_dt","processing_dt")
// val writer = outputDf.write
// writer.partitionBy("event_dt","processing_dt")
// writer.format("parquet")
// writer.option("path", outputPath)
// writer.save
Для версии Spark я использую версию 2.3
Если я удаляю настройку конфигурации перезаписи раздела, я получаю данные в выходном пути. Однако это не будет работать для меня потому что мне нужно, чтобы работа выполнялась в режиме перезаписи и обновляла только новые разделы.
Если я удаляю второй столбец из предложения partitionBy
, тогда данные успешно записываются, но мне это нужно раздел в данных, поэтому я не могу удалить его.
Кто-нибудь сталкивался с подобной проблемой или может помочь мне понять, почему я вообще получаю эту проблему в первую очередь?
Спасибо!