在Spark中读取CSV文件时如何忽略双引号?

时间:2019-02-04 19:47:54

标签: apache-spark pyspark

我有一个CSV文件,例如:

col1,col2,col3,col4
"A,B","C", D"

我想将其作为Spark中的数据帧读取,其中每个字段的值都完全与CSV中写的一样(我想将"字符视为常规字符,然后像复制一样任何其他字符)。

预期输出:

+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|  "A|  B"| "C"|  D"|
+----+----+----+----+

我得到的输出:

+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
| A,B|   C|  D"|null|
+----+----+----+----+

在pyspark中,我这样阅读:

dfr = spark.read.format("csv").option("header", "true").option("inferSchema", "true")

我知道,如果我添加这样的选项:

dfr.option("quote", "\u0000")

在上面的示例中我得到了预期的结果,因为char '"'的功能现在由'\u0000'完成,但是如果我的CSV文件包含'\u0000' char,我也可以得到错误的结果。

因此,我的问题是: 如何禁用引号选项,以便没有字符像引号一样起作用?

我的CSV文件可以包含任何字符,我希望将所有字符(逗号除外)简单地复制到其各自的数据帧单元中。我想知道是否有一种方法可以使用转义选项来完成此任务。

2 个答案:

答案 0 :(得分:1)

如果@pault建议的选项不起作用,这只是解决方法-

from pyspark.sql.functions import split
df = spark.createDataFrame([('"A,B","C", D"',),('""A,"B","""C", D"D"',)], schema = ['Column'])
df.show()
+-------------------+
|             Column|
+-------------------+
|      "A,B","C", D"|
|""A,"B","""C", D"D"|
+-------------------+

for i in list(range(4)):
    df = df.withColumn('Col'+str(i),split(df.Column, ',')[i])
df = df.drop('Column')
df.show()
+----+----+-----+-----+
|Col0|Col1| Col2| Col3|
+----+----+-----+-----+
|  "A|  B"|  "C"|   D"|
| ""A| "B"|"""C"| D"D"|
+----+----+-----+-----+

答案 1 :(得分:1)

摘自pyspark.sql.DataFrameReader.csv的文档(重点是我的):

  

quote –设置用于转义带引号的值的单个字符,其中分隔符可以是值的一部分。如果设置为None,则使用默认值“。如果要关闭引号,则需要设置一个空字符串。

dfr = spark.read.csv(
    path="path/to/some/file.csv",
    header="true",
    inferSchema="true",
    quote=""
)
dfr.show()
#+----+----+----+----+
#|col1|col2|col3|col4|
#+----+----+----+----+
#|  "A|  B"| "C"|  D"|
#+----+----+----+----+