【问题标题】:How to read a CSV file with commas within a field using pyspark? [duplicate]如何使用 pyspark 在字段中读取带逗号的 CSV 文件? [复制]
【发布时间】:2019-03-13 06:46:27
【问题描述】:

我有一个在列值中包含逗号的 csv 文件。例如,

Column1,Column2,Column3    
123,"45,6",789  

当数据中有多余的逗号时,这些值用双引号括起来。在上面的示例中,值为 Column1=123, Column2=45,6 和 Column3=789 但是,当尝试读取数据时,由于 Column2 字段中的额外逗号,它给了我 4 个值。

PySpark 中读取这些数据时如何获取正确的值?我正在使用 Spark 1.6.3

我目前正在执行以下操作以创建一个 rdd,然后从 rdd 创建一个数据框。

rdd = sc.textFile(input_file).map(lambda line: line.split(','))
df = sqlContext.createDataFrame(rdd) 

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql apache-spark-1.6


    【解决方案1】:

    您可以使用 SQLContext 将其直接读取到 DF:

    from pyspark.sql import SQLContext
    sqlContext = SQLContext(sc)
    
    df = sqlContext.read.format('com.databricks.spark.csv')
        .options(header='true', inferschema='true', quote='"', delimiter=',')
        .load(input_file)
    

    由于 Delimiter ',' 和 Quote '"' 是默认值,您也可以省略它们。默认情况下忽略引号内的逗号。可以在此处找到参数说明:https://github.com/databricks/spark-csv

    编辑:

    不依赖 Databricks,我只能想到一个更棘手的解决方案——这可能不是最好的方法:

    1. 用点替换数字中的逗号
    2. 使用剩余的逗号分割

    因此,您可以保留原始代码,并添加 REGEX 替换

    import re
    rdd = sc.textFile(input_file).map(lambda line: (re.sub(r'\"(\d+),(\d+)\"',r'\1.\2', line)).split(','))
    df.sqlContext.createDataFrame(rdd)
    

    提供的正则表达式也去掉了双引号。

    【讨论】:

    • 感谢托比的回复。你是说我们不能用 Spark 1.6 做到这一点。您的建议仅在我将 spark 升级到 2.0 时才有效。请指教。
    • 我提供的链接专门讨论了 Spark 1.6。所以这应该适用于 Spark 1.6。
    • 我看过了。是的,它适用于 Spark 1.6 .. 但是有没有办法在不使用 databricks 库的情况下做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多