我正在使用Spark读取CSV管道定界数据文件。报价合格。文本块中带有/ n,这会导致读取损坏。我不明白的是,它引用的是限定文字,所以肯定应该跳过它!这些行本身以CR + LN分隔。
反正不是。我该如何解决?我可以从提取物中清除它们,但对我来说似乎并不优雅。
这就是我用来加载数据的内容
val sch = spark.table("db.mytable").schema
val df = spark.read
.format("csv")
.schema(sch)
.option("header", "true")
.option("delimiter", "|")
.option("mode", "PERMISSIVE")
.option("quote", "\"")
.load("/yadaydayda/mydata.txt")
答案 0 :(得分:0)
首先在提取物中对它们进行剥离,从而解决了这一问题。但是,我最终确定的解决方案是在提取中使用木地板格式,然后所有这些问题都消失了。
答案 1 :(得分:0)
很高兴知道我不是在Spark中处理此问题的唯一人!
Spark逐行读取文件,因此其中包含换行符的CSV会导致解析器出现问题。逐行读取使Spark可以更轻松地处理大型CSV文件,而不是尝试解析所有内容以获取引号,这将严重损害案例的性能,而当尝试将其设置为高时则更可能不是问题。性能分析。
对于我知道可能存在换行符的情况,我使用了第三方CSV解析库,通过它运行CSV“行”(它将正确处理换行符),剥离换行符,写入/缓存文件某个位置,然后从该缓存文件中读取。对于生产用例,可以将这些文件加载到数据库中,或者用于日志文件或某些您不希望在数据库中使用的文件,可以像您建议的那样使用Parquet很好地工作,或者实际上只是在某些地方强制缺少换行符在文件到达Spark之前。