使用拆分列将 RDD 写入 csv

Posted

技术标签:

【中文标题】使用拆分列将 RDD 写入 csv【英文标题】:Write RDD to csv with split columns 【发布时间】:2017-02-21 17:16:05 【问题描述】:

我刚开始使用 Pyspark,想将文件保存为 csv 而不是文本文件。我尝试使用在 Stack Overflow 上找到的几个答案,例如

def toCSVLine(data):
   return ','.join(str(d) for d in data)

然后

 rdd = lines.map(toCSVLine)
 rdd.saveAsTextFile("file.csv")

它的工作原理是我可以在 excel 中打开它,但是所有信息都放在电子表格的 A 列中。我希望能够将 rdd 中的每一列(例如(“ID”,“rating”)放入 excel 中的单独列中,因此 ID 将在 A 列中,而 rating 将在 B 列中。有办法吗?

【问题讨论】:

【参考方案1】:

如果您使用的是 Spark >= 2.0 并假设您的 RDD 具有表格格式(如果您想将其保存为 CSV,则应该采用表格格式),一种方法可能是首先从 RDD 创建一个 Dataframe,然后使用 @ 987654321@ 导出为 CSV。

from pyspark.sql import SparkSession

spark = SparkSession(sc).getOrCreate()

df = spark.createDataframe(rdd)

df.write.csv("/path/to/file.csv", sep=',', header=True)

查看the pyspark.sql docs 了解更多选项和更多信息。

【讨论】:

有没有办法使用逗号作为分隔符而忽略引号内的逗号? 字符串中的逗号应该没问题,因为字符串应该被自动引用。你试过sepquoteescape等选项吗?【参考方案2】:

在 excel 中,您是在“,”上拆分文件吗?

在 excel 中,转到 数据 选项卡并在数据工具下选择 text to columns,然后选择 delimited 并点击下一步。然后选择 comma 作为分隔符并点击完成。

编辑

如果逗号将在您的数据中,通常最好创建一个分隔符与逗号不同的 csv。如果您正在创建 csv,请根据您的评论,只需使用不同的分隔符(例如“;”、“|”、“^”或制表符)。另一种我不太喜欢的选择是将有问题的字段包装在 "" 中,如下所示:

field0,field1,"field,2",field3

Excel 应该单独保留引号中的内容,并且只在引号之外的逗号上拆分。但这又不是我的首选解决方案。

【讨论】:

我确实尝试过这种方法,但是它将其中一行包含多个逗号的文本拆分为多个列。有没有办法在忽略引号内的逗号的情况下使用此方法?【参考方案3】:

一种选择是将 RDD 转换为数据帧,然后另存为 CSV。

from pyspark import SparkContext
df = sqlContext.createDataFrame(rdd, ['count', 'word'])
# Write CSV (I have HDFS storage)
df.coalesce(1).write.format('com.databricks.spark.csv').options(header='true').save('file:///home/username/csv_out')

请看我刚刚发布的这篇文章: How to write the resulting RDD to a csv file in Spark python

【讨论】:

这确实有效,但有没有办法让它忽略引号内的逗号?它将我需要保存在一起的一行文本分成多列,因为其中有一些逗号。 您可以使用另一个分隔符与 .option("delimiter", "|") 并在打开 Excel 时使用该分隔符 好吧,我能够让它与这段代码一起工作。感谢您的帮助。 这里的coalesce(1) 是有问题的。如果您的数据不适合一个分区怎么办?我认为跳过coalesce 并使用其他工具连接生成的文件(例如命令行上的cat 或您的标准python 文件操作)会更聪明

以上是关于使用拆分列将 RDD 写入 csv的主要内容,如果未能解决你的问题,请参考以下文章

DataFrame iterrows() 和 .to_csv:逐行写入

Pandas 按列将 CSV 拆分为多个 CSV(或 DataFrame)

根据列将大型 csv 文件拆分为多个文件

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

pyspark 按列将数据帧拆分为几个数据帧

java能否读取csv文件的同时也写入数据?