使用双引号和换行符读取pySpark中的csv文件

时间:2019-11-15 15:02:09

标签: python apache-spark pyspark

我在使用pySpark读取csv文件时遇到问题。我有URL地址,标题(字符串)和完整html文件的三列。最后一个字段用引号“ ...”括起来,其中任何引号都带有双引号,例如“ test”->“ test”(也包含换行符)。我可以使用pandas读取此文件,并且一切都很好,但是当我使用pySpark时,它不会破坏逗号(,)分隔符上的文本(我不确定,但可能在html内的换行符上)。这是示例代码:

df = spark.read \
    .option("header", "true") \
    .csv('path_to_file')

print( df.limit(2).collect() )

这是无效的示例文本:

url,body,title
https://test.com,"<!doctype html >
</html>",title_title

BTW vim在^M的末尾显示html >。也许这会引起问题?

更新 经过一番尝试,我得出的结论是pyspark将引号内的换行符解释为另一行的开头。但是,只有当我在文件中按“ Enter”作为跳到新行时,它才会这样做。如果显式编写\n,则可以。 这件作品:

url,body,title
https://test.com,"<!doctype html >\n</html>",title_title

熊猫在这两个版本上都可以使用!

2 个答案:

答案 0 :(得分:1)

这似乎可行:

df = (spark.read
      .option("multiline", "true")
      .option("quote", '"')
      .option("header", "true")
      .option("escape", "\\")
      .option("escape", '"')
      .csv('path_to_file')
)

经过scala_2.11.0spark_2.3.4_hadoop2.7的测试

答案 1 :(得分:0)

如上所述,可以在Spark Reading Config中包含选项。

 sc.read\
        .option("multiline", "true")\
        .option("quote", '"')\
        .option("header", "true")\
        .option("escape", "\\")\
        .option("escape", '"')\
        .csv(f'{getpathfile()}/files/{file}.csv')