如何使用pyspark读取包含逗号字段的CSV文件?

4

我有一个包含某列值中逗号的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个回答

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)

作为默认值的分隔符“,”和引号“”可以省略。默认情况下,引号内的逗号会被忽略。参数的描述可以在此处找到: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)

提供的正则表达式还可以除去双引号。

谢谢你的回复,Tobi。你的意思是说我们不能用Spark 1.6来做到这一点吗?你的建议只有在我升级到Spark 2.0时才有效。请给予建议。 - Bob
我提供的链接特别讨论了Spark 1.6。因此,这应该可以与Spark 1.6一起使用。 - Tobi
我查看了一下。是的,它适用于Spark 1.6..但是有没有不使用Databricks库来完成这个操作的方法? - Bob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接