所以,这个问题已经被讨论了很多,但它应该在Spark 2.2.0中修复,它刚刚发布。据我所知,wholeLine
选项应该可以解决这个问题,但是我没有运气。问题在于,如果某个值中存在换行符,例如,其中包含一堆文本的notes列,并且这些笔记中有换行符,则Spark会将其视为新行。< / p>
以下是我用来从CSV中读取数据的代码段。
sparkSession.read
.option("header", "true")
.option("delimiter", ",")
.option("multiLine", "true")
.option("inferSchema", true)
.option("wholeFile", "true")
.option("quoteMode", "ALL")
.option("parserLib", "univocity")
.csv(csvFilePath)
正如您所知,我在阳光下使用了每个选项,但我仍然得到错误的输出。我得到的输出在下面,这些都应该是唯一的整数,但它们被来自另一行的其他列的数据污染。我稍微更改了数据,但您可以看到列中包含ID的字符串数据。
+--------------------+
| ID|
+--------------------+
| 3876849|
| 3876872|
| consistent|
| 4/30|
|,blah blah blah ...|
| 3876876|
| 3876878|
| 5-6 days ago"|
| 3876879|
| 3876880|
|blah blah blah bl...|
| 3876893|
|*blah blah blah ...|
| 3876900|
| 3876904|
+--------------------+
这让我非常难过,好吧,我也包括我的build.sbt。
name := "MyApp"
organization := "com.test"
version := "1.0-SNAPSHOT"
scalaVersion := "2.11.8"
libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.11" % "2.2.0" % "provided",
"org.apache.spark" % "spark-sql_2.11" % "2.2.0" % "provided",
"org.apache.spark" % "spark-hive_2.11" % "2.2.0" % "provided",
"org.elasticsearch" % "elasticsearch-spark-20_2.11" % "5.5.0",
"org.apache.logging.log4j" % "log4j-core" %"2.8.2"
)
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
}
assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = false)