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 文件的主要内容,如果未能解决你的问题,请参考以下文章