【问题标题】:How to ignore double quotes when reading CSV file in Spark?在 Spark 中读取 CSV 文件时如何忽略双引号?
【发布时间】:2019-06-28 14:49:20
【问题描述】:

我有一个 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 文件可以包含任何字符,并且我希望将所有字符(逗号除外)简单地复制到它们各自的数据框单元格中。我想知道是否有办法使用转义选项来完成此操作。

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案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"|
    #+----+----+----+----+
    

    【讨论】:

      【解决方案2】:

      如果@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"|
      +----+----+-----+-----+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-13
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多