Spark - 如何在没有文件夹的情况下编写单个csv文件?

ant*_*CR1 20 csv export-to-csv apache-spark

假设这df是Spark中的数据帧.写入df单个CSV文件的方法是

df.coalesce(1).write.option("header", "true").csv("name.csv")

这会将数据帧写入包含在name.csv被调用文件夹中的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文件放在一个文件夹中(而不是文件夹)的文件夹).

任何帮助表示赞赏.

小智 5

一种可能的解决方案是将 Spark 数据帧转换为 Pandas 数据帧并将其保存为 csv:

df.toPandas().to_csv("<path>/<filename>")
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案具有潜在危险,因为 Spark DataFrame 中的所有数据都将加载到 Spark 驱动程序节点上的单个 Pandas DataFrame 中。因此,如果您有大量数据,则驱动程序节点上的内存可能会耗尽!见 http://spark.apache.org/docs/2.2.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.toPandas (8认同)
  • 我认为这适用于 Pyspark,但 Spark 呢? (3认同)

smw*_*smw 5

如果您只想使用 python 标准库,这是一个简单的函数,可以写入单个文件。您不必弄乱临时文件或通过另一个目录。

import csv

def spark_to_csv(df, file_path):
    """ Converts spark dataframe to CSV file """
    with open(file_path, "w") as f:
        writer = csv.DictWriter(f, fieldnames=df.columns)
        writer.writerow(dict(zip(fieldnames, fieldnames)))
        for row in df.toLocalIterator():
            writer.writerow(row.asDict())
Run Code Online (Sandbox Code Playgroud)


lea*_*ner -6

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

你可以使用这个,如果你不想每次都给出 CSV 的名称,你可以编写 UDF 或创建一个 CSV 文件名数组并将其提供给它,它将起作用

  • 这仍然会将数据帧写入文件夹,并且实际 CSV 文件的名称仍然称为“part-00000-c5f99bbc-f9a8-4fe6-bb47-9413f1fb4591.csv” (8认同)