Spark - Как написать одиночный файл csv БЕЗ папки?

Предположим, что 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 в папке (а не в папке папок).

Любая помощь приветствуется.

Ответ 1

Возможным решением может быть преобразование кадра данных Spark в кадр данных pandas и сохранение его в формате csv:

df.toPandas().to_csv("<path>/<filename>")

Ответ 2

Не существует 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) после завершения операции записи.

Ответ 3

df.write.mode("overwrite").format("com.databricks.spark.csv").option("header", "true").csv("PATH/FOLDER_NAME/x.csv")

вы можете использовать это, и если вы не хотите указывать имя CSV каждый раз, когда можете писать UDF или создавать массив имени файла CSV и давать ему это, он будет работать