【问题标题】:How to fetch all rows data from spark dataframe to a file using pyspark in databricks如何使用databricks中的pyspark将所有行数据从spark数据帧获取到文件
【发布时间】:2020-09-29 18:20:35
【问题描述】:
我正在尝试将 spark 数据帧中的所有行数据提取到数据块中的文件中。我能够将 df 数据写入只有很少计数的文件。假设如果我将 df 中的计数设为 100 ,那么在文件中它的计数为 50 ,因此它正在跳过数据。如何在不跳过数据的情况下将完整的数据从数据帧加载到文件中。我创建了一个 udf,udf 将打开文件并将数据附加到它。我在 spark sql df 中调用了该 udf。
有人可以帮我解决这个问题吗?
【问题讨论】:
标签:
python
pyspark
apache-spark-sql
azure-databricks
【解决方案1】:
出于以下几个原因,我建议您不要使用 udf:
- UDF 在工作节点上运行,因此您将拥有多个 udf,每个都将一部分数据写入本地文件。
- 即使您将 UDF 附加到共享位置(如 DBFS)中的文件,您仍然有多个节点同时写入文件,这可能会导致错误。
- Spark 已经有一种开箱即用的方法,您应该利用它
将 spark 数据帧写入数据块中的文件:
使用 Dataframe.write 属性 (Databricks docs)。
有很多选择,所以应该可以做任何你需要的事情(Spark docs(这个是用于 CSV 的))
关于分区的注意事项: Spark 将 DF 的每个分区写入自己的文件中,因此您应该使用 coalesce 函数(警告:对于非常大的数据帧,这非常慢,因为 spark 必须适合整个数据帧到驱动节点上的内存中)
文件位置注意事项:您提供的文件路径将位于驱动程序节点上,因此除非您打算使用另一个脚本读取它,否则您应该以 "/dbfs" 开头,它挂载到所有节点的文件系统上。这样,它就保存在 Databricks 文件系统上,可以从 Databricks 实例中的任何集群访问。 (也可以使用 Databricks CLI 下载。)
完整示例:
df_to_write = my_df.select(<columns you want>)
df_to_write.coalesce(1).write.csv("/dbfs/myFileDownloads/dataframeDownload.csv")