首页 > 解决方案 > 用双引号和换行符在pySpark中读取csv文件

问题描述

我在使用 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

顺便说一句,vim 显示^Mhtml >. 也许这会引起问题?

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

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

熊猫适用于两个版本!

标签: pythonapache-sparkpyspark

解决方案


这似乎有效:

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


推荐阅读