使用拆分列将 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 了解更多选项和更多信息。
【讨论】:
有没有办法使用逗号作为分隔符而忽略引号内的逗号? 字符串中的逗号应该没问题,因为字符串应该被自动引用。你试过sep
、quote
、escape
等选项吗?【参考方案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)