1

我有一个在列值中包含逗号的 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) 
4

1 回答 1

4

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

提供的 REGEX 也去掉了双引号。

于 2018-10-08T15:08:05.870 回答