У меня есть следующий код:
val testRDD: RDD[(String, Vector)] = sc.parallelize(testArray)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
val df = testRDD.toDF()
df.write.parquet(path)
со следующим build.sbt:
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.1"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.6.1"
libraryDependencies += "org.apache.spark" %% "spark-mllib" % "1.6.1"
// META-INF discarding
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
{
case "reference.conf" => MergeStrategy.concat
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
}
}
Когда я создаю это с помощью sbt-assembly (у меня есть addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")), а затем запускаю его, я получаю сообщение об ошибке:
Exception in thread "main" java.lang.ClassNotFoundException: Failed to find data source: parquet. Please find packages at http://spark-packages.org
at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.lookupDataSource(ResolvedDataSource.scala:77)
at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.apply(ResolvedDataSource.scala:219)
at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:148)
at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:139)
at org.apache.spark.sql.DataFrameWriter.parquet(DataFrameWriter.scala:334)
at InductionService.Application$.main(ParquetTest.scala:65)
Однако, если я соберу это с помощью IntelliJ Idea (обычная сборка, а не толстый JAR, как со сборкой sbt) и отлажу его в этой среде IDE, это действительно сработает. Так что явно что-то не так с тем, как я строю это, используя сборку sbt, но я не знаю, как это исправить. Есть идеи?
У меня есть подозрения, что причиной может быть код отбрасывания merge-inf в build.sbt, но мне нужен этот код, иначе я не смогу выполнить сборку с помощью sbt-assembly. (он жалуется на дубликаты...)