【问题标题】:Write RDD to csv with split columns使用拆分列将 RDD 写入 csv
【发布时间】: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 列中。有办法吗?

【问题讨论】:

    标签: python csv pyspark


    【解决方案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 文件操作)会更聪明
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2018-11-29
    • 2020-09-13
    相关资源
    最近更新 更多