【问题标题】:How to save a PySpark dataframe as a CSV with custom file name?如何将 PySpark 数据框保存为具有自定义文件名的 CSV?
【发布时间】:2021-12-06 15:50:20
【问题描述】:

这是我想保存为 csv 的 spark DataFrame。

type(MyDataFrame)
--Output: <class 'pyspark.sql.dataframe.DataFrame'>

要将其保存为 CSV,我有以下代码:

MyDataFrame.write.csv(csv_path, mode = 'overwrite', header = 'true')

当我保存这个时,文件名是这样的:

part-0000-766dfdf-78fg-aa44-as3434rdfgfg-c000.csv

有没有办法在保存时给它一个自定义名称?喜欢 "MyDataFrame.csv"

【问题讨论】:

    标签: python dataframe apache-spark hadoop pyspark


    【解决方案1】:

    没有。这就是 Spark 的工作方式(至少目前如此)。您将拥有MyDataFrame.csv 作为目录名称,在该目录下,您将拥有多个与part-0000-766dfdf-78fg-aa44-as3434rdfgfg-c000.csvpart-0000-766dfdf-78fg-aa44-as3434rdfgfg-c001.csv 等格式相同的文件

    不建议这样做,但如果您的数据足够小(可以说这里的“足够小”),您可以随时将其转换为 Pandas 并将其保存到一个 CSV 文件中,使用您想要的任何名称。

    【讨论】:

      【解决方案2】:

      我也有同样的需求。你可以写入一个路径,然后更改文件路径。这是我的解决方案。

      def write_to_hdfs_specify_path(df, spark, hdfs_path, file_name):
          """
          :param df: dataframe which you want to save
          :param spark: sparkSession
          :param hdfs_path: target path(shoul be not exises)
          :param file_name: csv file name
          :return: 
          """
          sc = spark.sparkContext
          Path = sc._gateway.jvm.org.apache.hadoop.fs.Path
          FileSystem = sc._gateway.jvm.org.apache.hadoop.fs.FileSystem
          Configuration = sc._gateway.jvm.org.apache.hadoop.conf.Configuration
          df.coalesce(1).write.option("header", True).option("delimiter", "|").option("compression", "none").csv(hdfs_path)
          fs = FileSystem.get(Configuration())
          file = fs.globStatus(Path("%s/part*" % hdfs_path))[0].getPath().getName()
          full_path = "%s/%s" % (hdfs_path, file_name)
          result = fs.rename(Path("%s/%s" % (hdfs_path, file)), Path(full_path))
          return result
      

      【讨论】:

        【解决方案3】:

        .coalesce(1)会保证只有1个文件但不保证文件名。请使用一些临时目录来保存它,然后重命名并复制(如果您使用 databricks 或使用 Hadoop API 中的 FileUtil,则使用 dbutils.fs 函数)。

        【讨论】:

          猜你喜欢
          • 2020-06-15
          • 1970-01-01
          • 2019-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多