Преобразование фрейма данных из одной формы в другую:
Parquet -> Parquet (number of rows remains same, NO PROBLEM)
Parquet -> CSV (number of rows INCREASES! Data corruption!)
Сначала считайте данные из паркета, затем преобразуйте их в CSV / Parquet, используя команду ниже:
<input_dataframe>.coalesce(1).write.option("header", true).csv/parquet(output_path)
scala> spark.read.option("header", true).parquet(input_path).count
Long = 8387913
scala> spark.read.option("header", true).csv(output_path).count
Long = 8387932
В результате этого строки смешиваются друг с другом, и записи переливаются или повреждаются.
Есть обходной путь ТОЛЬКО в том случае, если вам нужно прочитать csv с помощью spark . Вы можете передать опцию multiline
как true
.
scala> spark.read.option("header", true).option("multiline", true).csv(output_path).count
Long = 8387913 << input parquet contains same number of records
Но это не то, что я хочу делать с CSV. Мне нужно прочитать без искры.
Как сохранить структуру нетронутой при записи фрейма данных в csv ?
ПРИМЕЧАНИЕ. Это может быть не воспроизводимым случаем для всех фреймов данных. В моих данных он есть по неизвестным причинам. Я заметил эту проблему, когда обнаружил, что поле строкового типа хранит целое значение в результирующем CSV, и весь набор записей поврежден произвольными значениями. Размер CSV ~ 2,5 ГБ.