如何使用pyspark在字段中读取带逗号的CSV文件?

时间:2018-10-08 14:54:18

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

我有一个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) 

1 个答案:

答案 0 :(得分:2)

您可以使用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)

由于分隔符','和引号'“'是默认值,您也可以忽略它们。默认情况下,引号内的逗号将被忽略。有关参数的说明,请参见: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)

提供的REGEX也消除了双引号。