Ответ 1
Возможным решением может быть преобразование кадра данных Spark в кадр данных pandas и сохранение его в формате csv:
df.toPandas().to_csv("<path>/<filename>")
Предположим, что df
является файловой рамкой в Spark. Способ записи df
в один CSV файл
df.coalesce(1).write.option("header", "true").csv("name.csv")
Это запишет dataframe в файл CSV, содержащийся в папке с именем name.csv
но фактический файл CSV будет называться чем-то вроде part-00000-af091215-57c0-45c4-a521-cd7d9afb5e54.csv
.
Я хотел бы знать, можно ли избежать папки name.csv
и иметь фактический CSV файл с именем name.csv
а не part-00000-af091215-57c0-45c4-a521-cd7d9afb5e54.csv
. Причина в том, что мне нужно написать несколько файлов CSV, которые позже я буду читать вместе на Python, но мой код Python использует фактические имена CSV, а также должен иметь все отдельные файлы CSV в папке (а не в папке папок).
Любая помощь приветствуется.
Возможным решением может быть преобразование кадра данных Spark в кадр данных pandas и сохранение его в формате csv:
df.toPandas().to_csv("<path>/<filename>")
Не существует API-интерфейса Spark для данных, который записывает/создает отдельный файл вместо каталога в результате операции записи.
Ниже обе опции создадут один отдельный файл внутри каталога вместе со стандартными файлами (_SUCCESS , _committed , _started)
.
1. df.coalesce(1).write.mode("overwrite").format("com.databricks.spark.csv").option("header",
"true").csv("PATH/FOLDER_NAME/x.csv")
2. df.repartition(1).write.mode("overwrite").format("com.databricks.spark.csv").option("header",
"true").csv("PATH/FOLDER_NAME/x.csv")
Если вы не используете coalesce (1) или repartition (1) и воспользуетесь преимуществом параллелизма искр для записи файлов, то это создаст несколько файлов данных внутри каталога.
Вам необходимо написать функцию в драйвере, которая объединит все части файла данных в один файл (cat part-00000 * singlefilename) после завершения операции записи.
df.write.mode("overwrite").format("com.databricks.spark.csv").option("header", "true").csv("PATH/FOLDER_NAME/x.csv")
вы можете использовать это, и если вы не хотите указывать имя CSV каждый раз, когда можете писать UDF или создавать массив имени файла CSV и давать ему это, он будет работать