Circe: Auto-derived Decoder schlägt mit NoClassDefFoundError fehl

Erstellt am 25. Feb. 2017  ·  4Kommentare  ·  Quelle: circe/circe

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)

Hilfreichster Kommentar

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.

Alle 4 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen