如何使用自定义文件名将 PySpark 数据框另存为 CSV?
How to save a PySpark dataframe as a CSV with custom file name?
这是我要保存为 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"
没有。这就是 Spark 的工作方式(至少目前如此)。您将 MyDataFrame.csv
作为 目录名称 ,并且在该目录下,您将拥有多个格式与 part-0000-766dfdf-78fg-aa44-as3434rdfgfg-c000.csv
、part-0000-766dfdf-78fg-aa44-as3434rdfgfg-c001.csv
等
不推荐,但如果您的数据足够小(可以说这里是“足够小”),您可以随时将其转换为 Pandas 并将其保存到一个 CSV 文件中,您可以随意命名通缉
我也一样requirement.You可以写入一个路径,然后改变文件路径。这是我的解决方案。
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
.coalesce(1)
将保证只有1个文件,但不保证文件名。请使用一些临时目录来保存它,而不是重命名它并复制(如果您使用数据块,则使用 dbutils.fs 函数或使用来自 Hadoop API 的 FileUtil)。
这是我要保存为 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"
没有。这就是 Spark 的工作方式(至少目前如此)。您将 MyDataFrame.csv
作为 目录名称 ,并且在该目录下,您将拥有多个格式与 part-0000-766dfdf-78fg-aa44-as3434rdfgfg-c000.csv
、part-0000-766dfdf-78fg-aa44-as3434rdfgfg-c001.csv
等
不推荐,但如果您的数据足够小(可以说这里是“足够小”),您可以随时将其转换为 Pandas 并将其保存到一个 CSV 文件中,您可以随意命名通缉
我也一样requirement.You可以写入一个路径,然后改变文件路径。这是我的解决方案。
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
.coalesce(1)
将保证只有1个文件,但不保证文件名。请使用一些临时目录来保存它,而不是重命名它并复制(如果您使用数据块,则使用 dbutils.fs 函数或使用来自 Hadoop API 的 FileUtil)。