Databricks -即使指定为CSV文件,也将CSV写入Parquet文件夹



我有一些代码执行一些ETL,这是完美的工作与Databricks。然而,我有一个同事想要CSV格式的数据,这样他们就可以将信息摄取到他们本地的SQL数据库中。

目前我在Parquet中像这样写所有的数据

filelocation = f"/mnt/successfactors-work/{dimname}/{year}/{year}{month}/{dimname}_{year}{month}{day}.parquet"
df.write.mode("overwrite").parquet(filelocation)

这一切都很好,在这下面我写了这样的代码:

df.write.format("csv").mode("overwrite").save(f"/mnt/successfactors-work/{dimname}/{dimname}.csv")

然而,似乎发生的事情不是写一个CSV文件,而是写到文件夹内的多个文件,我认为这是因为Databricks/Spark的分布式处理性质?是这样吗?有没有办法把它写成一个单一的CSV?

可以得到一个CSV,但是我必须在databricks内运行数据,然后使用UI来执行df.display()并使用图标下载-这是不理想的。

如有建议,不胜感激。

  • 使用PysparkDataFrame.write()总是创建一个文件夹里面是必需的文件。你的数据(大)往往是重新分区和写成多个文件在这个文件夹中,这些被称为part files

  • 因此,要将数据写入该文件夹中的单个文件,您可以使用DataFrame.repartition()DataFrame.coalesce()。这些方法帮助将数据框写入NN作为参数传递给上述方法。

  • 因此,您可以将代码更改为以下内容:

df.repartition(1).write.format("csv").mode("overwrite").save(f"/mnt/successfactors-work/{dimname}/{dimname}.csv")

注意:如果不想将文件写入文件夹,则必须使用pandas dataframe来写入,而不是使用pyspark。您可以尝试使用以下代码:

pandas_df = df.toPandas()
pandas_df.to_csv(f"/dbfs/mnt/successfactors-work/{dimname}/{dimname}.csv", mode='w', index=False)

最新更新