J'essaie d'utiliser le spark-avro
package comme décrit dans Apache Avro Data Source Guide .
Lorsque je soumets la commande suivante:
val df = spark.read.format("avro").load("~/foo.avro")
Je reçois une erreur:
Java.util.ServiceConfigurationError: org.Apache.spark.sql.sources.DataSourceRegister: Provider org.Apache.spark.sql.avro.AvroFileFormat could not be instantiated
at Java.util.ServiceLoader.fail(ServiceLoader.Java:232)
at Java.util.ServiceLoader.access$100(ServiceLoader.Java:185)
at Java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.Java:384)
at Java.util.ServiceLoader$LazyIterator.next(ServiceLoader.Java:404)
at Java.util.ServiceLoader$1.next(ServiceLoader.Java:480)
at scala.collection.convert.Wrappers$JIteratorWrapper.next(Wrappers.scala:43)
at scala.collection.Iterator$class.foreach(Iterator.scala:891)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1334)
at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
at scala.collection.TraversableLike$class.filterImpl(TraversableLike.scala:247)
at scala.collection.TraversableLike$class.filter(TraversableLike.scala:259)
at scala.collection.AbstractTraversable.filter(Traversable.scala:104)
at org.Apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:630)
at org.Apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:194)
at org.Apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
... 49 elided
Caused by: Java.lang.NoSuchMethodError: org.Apache.spark.sql.execution.datasources.FileFormat.$init$(Lorg/Apache/spark/sql/execution/datasources/FileFormat;)V
at org.Apache.spark.sql.avro.AvroFileFormat.<init>(AvroFileFormat.scala:44)
at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:62)
at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:45)
at Java.lang.reflect.Constructor.newInstance(Constructor.Java:423)
at Java.lang.Class.newInstance(Class.Java:442)
at Java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.Java:380)
... 62 more
J'ai essayé différentes versions du org.Apache.spark:spark-avro_2.12:2.4.0
package (2.4.0, 2.4.1 et 2.4.2), et j'utilise actuellement Spark 2.4.1, mais aucun n'a fonctionné.
Je démarre mon spark-Shell avec la commande suivante:
spark-Shell --packages org.Apache.spark:spark-avro_2.12:2.4.0
tl; dr Puisque Spark 2.4.x + fournit un support intégré pour la lecture et l'écriture d'Apache Avro data , mais le module spark-avro est externe et n'est pas inclus dans spark-submit ou spark-Shell par défaut , vous devez vous assurer que vous utilisez le même Scala version (ex. 2.12) pour le spark-Shell
et --packages
.
La raison de l'exception est que vous utilisez spark-Shell
qui est de Spark construit contre Scala 2.11.12 tandis que --packages
spécifie une dépendance avec Scala 2.12 (dans org.Apache.spark:spark-avro_2.12:2.4.0
).
Utilisation --packages org.Apache.spark:spark-avro_2.11:2.4.0
et ça devrait aller.
juste au cas où quelqu'un serait intéressé par pyspark 2.7 et spark 2.4.3
sous le paquet fonctionne
bin/pyspark --packages org.Apache.spark:spark-avro_2.11:2.4.3
Une autre chose que j'ai remarquée lorsque j'ai eu le même problème, c'est qu'il fonctionne bien pour la première fois et montre l'erreur par la suite. Videz donc le cache en ajoutant la commande rm au fichier docker. C'était suffisant dans mon cas.