在阅读和解析CSV文件时,我遇到了一个问题。有些记录有换行符号,"转义"通过\,并且该记录未被引用。该文件可能如下所示:
Line1field1;Line1field2.1 \
Line1field2.2;Line1field3;
Line2FIeld1;Line2field2;Line2field3;
我尝试使用sc.textFile("file.csv")
并使用sqlContext.read.format("..databricks..").option("escape/delimiter/...").load("file.csv")
然而,无论我如何阅读它,都会在" \ \ n"时创建记录/行/行。达到了。所以,我没有从前一个文件中获得2条记录,而是获得了三条记录:
[Line1field1,Line1field2.1,null] (3 fields)
[Line1field.2,Line1field3,null] (3 fields)
[Line2FIeld1,Line2field2,Line2field3;] (3 fields)
预期结果是:
[Line1field1,Line1field2.1 Line1field.2,Line1field3] (3 fields)
[Line2FIeld1,Line2field2,Line2field3] (3 fields)
(新行符号如何保存在记录中并不重要,主要问题是拥有正确的记录/行集)
有关如何做到这一点的任何想法?无需修改原始文件,最好不进行任何后期/重新处理(例如,读取文件并过滤字段数少于预期的任何行,并且连接它们可能是一种解决方案,但根本不是最优的)
我希望使用databrick的csv解析器将转义字符设置为\(默认情况下应该是这样),但是没有用[发生了错误说法]
java.io.IOException: EOF whilst processing escape sequence
]。
我应该以某种方式扩展解析器并编辑一些东西,创建我自己的解析器吗?哪个是最好的解决方案?
谢谢!
编辑:忘记提及,我使用的是火花1.6
答案 0 :(得分:1)
wholeTextFiles
api应该是救援者api。它将文件读取为键,值对:键作为文件的路径,值作为文件的整个文本。您将不得不进行一些替换和拆分以获得所需的输出
val rdd = sparkSession.sparkContext.wholeTextFiles("path to the file")
.flatMap(x => x._2.replace("\\\n", "").replace(";\n", "\n").split("\n"))
.map(x => x.split(";"))
rdd
输出
[Line1field1,Line1field2.1 Line1field2.2,Line1field3]
[Line2FIeld1,Line2field2,Line2field3]