Pyspark - 将数据帧写入 2 个不同的 csv 文件

Posted

技术标签:

【中文标题】Pyspark - 将数据帧写入 2 个不同的 csv 文件【英文标题】:Pyspark - write a dataframe into 2 different csv files 【发布时间】:2017-09-13 13:35:49 【问题描述】:

我想将单个 DataFrame 保存到 2 个不同的 csv 文件中(拆分 DataFrame)——一个只包含标题,另一个包含其余的行。

我想将这 2 个文件保存在同一目录下,因此如果可能,Spark 处理所有逻辑将是最好的选择,而不是使用 pandas 拆分 csv 文件。

最有效的方法是什么?

感谢您的帮助!

【问题讨论】:

只需进行子进程调用并使用 bash 进行。这样应该更容易。 @philantrovert 例如,处理 ~1TB 文件可能会很慢,即使使用 bash ;) 【参考方案1】:

假设您有一个名为“df”的数据集。

您可以: 选项一:写两次:

df.write.(...).option("header", "false").csv(....)
df.take(1).option("header", "true").csv() // as far as I remember, someone had problems with saving DataFrame without rows -> you must write at least one row and then manually cut this row using normal Java or Python file API

或者您可以使用 header = true 编写一次,然后使用普通 Java API 手动剪切标题并将其放入新文件中

【讨论】:

感谢您的回答。还有一个问题,Spark 不会将 2 个文件写入不同的目录吗?是否可以将它们保存在同一目录中? 第二行不会写两行吗? take(1) 会获取第一行数据,header, true 也会写入标题? @Young 您应该写入单独的文件夹,然后移动文件。不幸的是,文件的分区方式与 DataFrame 完全相同。如果要将所有内容保存在一个文件中,请记住使用repartition(1) @philantrovert 正如评论中所说 - 有一个关于 SO 的问题(我现在找不到它),如果 DataFrame 为空,Spark 不会保存标头。所以我们必须至少得到 1 行,然后使用标准 API 手动剪切这一行,而不是 Spark。但是,只有一行,它会简单得多【参考方案2】:

数据,无标题:

df.to_csv("filename.csv", header=False)

标题,无数据:

df_new = pd.DataFrame(data=None, columns=df_old.columns) # data=None makes sure no rows are copied to the new dataframe
df_new.to_csv("filename.csv")

【讨论】:

它;没关系,但是 - 根据 JavaDoc.. PythonDoc? ;) " .. note:: 这种方法只应在生成的 Pandas 的 DataFrame 很小的情况下使用,因为所有数据都加载到驱动程序的内存中。"

以上是关于Pyspark - 将数据帧写入 2 个不同的 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 PySpark 写入数据帧时出错

Pyspark:将df写入具有特定名称的文件,绘制df

PySpark:如何将具有 SparseVector 类型的列的 Spark 数据帧写入 CSV 文件?

Pyspark 将数据帧结果写入文本文件

将 PySpark 数据帧写入分区 Hive 表

使用 pyspark 将数据帧写入 Kafka 时出现异常