Ich bin mir nicht sicher, ob dies ein Fehler in circe oder der Verwendung von circe ist, oder ein Problem im Zusammenhang mit Spark- und Circe-Klassenpfaden oder etwas ganz anderem. Wäre dankbar für Hinweise, wie man dies debuggen kann.
build.sbt
scalaVersion := "2.11.8"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.1.0"
libraryDependencies ++= Seq("core", "generic").map(module => "io.circe" %% s"circe-$module" % "0.7.0")
Main.scala
import org.apache.spark.sql._
import io.circe.generic.auto._
import io.circe.Json
case class Repo[T: Encoder](path: String) {
def read(spark: SparkSession): Seq[T] =
spark.read.option("header", true).option("inferSchema", true).csv(path).as[T].collect().toSeq
}
case class Record(a: Int, b: Int, c: Int)
object Main {
val json = Json.obj("path" -> Json.fromString("data.csv"))
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().master("local[1]").getOrCreate()
import spark.implicits._
val repo = json.as[Repo[Record]].right.get
println(repo.read(spark))
}
}
daten.csv
a,b,c
1,2,3
Konsole
> sbt clean run
[info] Set current project to circe-error (in build file:/opt/circe-error/)
[success] Total time: 1 s, completed 25-Feb-2017 11:23:00 AM
[info] Updating {file:/opt/circe-error/}circe-error...
[info] Resolving jline#jline;2.12.1 ...
[info] Done updating.
[info] Compiling 1 Scala source to /opt/circe-error/target/scala-2.11/classes...
[info] Running Main
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
17/02/25 11:23:28 INFO SparkContext: Running Spark version 2.1.0
[...]
17/02/25 11:23:30 INFO SharedState: Warehouse path is 'file:/opt/circe-error/spark-warehouse/'.
[error] (run-main-0) java.lang.NoClassDefFoundError: Main/repo$anon$macro$18
java.lang.NoClassDefFoundError: Main/repo$anon$macro$18
at Main$anon$exportDecoder$macro$21$1$anon$macro$18$1.from(Main.scala:19)
at Main$anon$exportDecoder$macro$21$1$anon$macro$18$1.from(Main.scala:19)
at shapeless.LabelledGeneric$$anon$1.from(generic.scala:229)
at shapeless.LabelledGeneric$$anon$1.from(generic.scala:226)
at io.circe.generic.decoding.DerivedDecoder$$anon$1.apply(DerivedDecoder.scala:14)
at io.circe.Json.as(Json.scala:97)
at Main$.main(Main.scala:19)
at Main.main(Main.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
Caused by: java.lang.ClassNotFoundException: Main.repo$anon$macro$18
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at Main$anon$exportDecoder$macro$21$1$anon$macro$18$1.from(Main.scala:19)
at Main$anon$exportDecoder$macro$21$1$anon$macro$18$1.from(Main.scala:19)
at shapeless.LabelledGeneric$$anon$1.from(generic.scala:229)
at shapeless.LabelledGeneric$$anon$1.from(generic.scala:226)
at io.circe.generic.decoding.DerivedDecoder$$anon$1.apply(DerivedDecoder.scala:14)
at io.circe.Json.as(Json.scala:97)
at Main$.main(Main.scala:19)
at Main.main(Main.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
Hatte das gleiche Problem mit circe-0.8.0
Einige Aktualisierungen:
In meinem Fall ist es der Abhängigkeitskonflikt zwischen circe
und spark
. circe-generic % 0.8.0
und circe-generic-extras % 0.8.0
verwenden shapeless % 2.3.2
, während spark
shapeless % 2.0.0
verwenden. Und shapeless
ist in diesem Fall nicht abwärtskompatibel.
Die Problemumgehung besteht darin, shapeless % 2.3.2
während sbt assembly
$ auf einen anderen Namen zu schattieren.
Der aktuelle Meister von Spark hängt von der Breeze-Version 0.13.2 ab, die die formlose Version 2.3.2 verwendet. Es besteht also die Hoffnung, dass sich das von selbst löst.
Ich konnte dies mit Spark 2.2.0 reproduzieren, das Brise 0.13.1 und Shapeless 2.3.2 verwendet.
Hilfreichster Kommentar
Einige Aktualisierungen:
In meinem Fall ist es der Abhängigkeitskonflikt zwischen
circe
undspark
.circe-generic % 0.8.0
undcirce-generic-extras % 0.8.0
verwendenshapeless % 2.3.2
, währendspark
shapeless % 2.0.0
verwenden. Undshapeless
ist in diesem Fall nicht abwärtskompatibel.Die Problemumgehung besteht darin,
shapeless % 2.3.2
währendsbt assembly
$ auf einen anderen Namen zu schattieren.