web-dev-qa-db-fra.com

Comment utiliser le paquet spark-avro pour lire le fichier avro à partir de spark-shell?

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

enter image description here

9
sahibeast

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.

10
Jacek Laskowski

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
2
Suresh Chaganti

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.

0
Sowmya