我在使用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
熊猫在这两个版本上都可以使用!
答案 0 :(得分:1)
这似乎可行:
df = (spark.read
.option("multiline", "true")
.option("quote", '"')
.option("header", "true")
.option("escape", "\\")
.option("escape", '"')
.csv('path_to_file')
)
经过scala_2.11.0
和spark_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')