Как использовать пакет spark-avro для чтения файла avro из spark-shell?

Я пытаюсь использовать пакет spark-avro, как описано в Apache Avro Data Руководство по источникам.

Когда я отправляю следующую команду:

val df = spark.read.format("avro").load("~/foo.avro")

Я получаю сообщение об ошибке:

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

Я пробовал разные версии пакета org.apache.spark:spark-avro_2.12:2.4.0 (2.4.0, 2.4.1 и 2.4.2), и в настоящее время использую Spark 2.4.1, но ни одна из них не сработала.

Я запускаю свою искровую оболочку следующей командой:

spark-shell --packages org.apache.spark:spark-avro_2.12:2.4.0

введите описание изображения здесь


person sahibeast    schedule 26.04.2019    source источник


Ответы (3)


tl; dr Начиная с версии Spark 2.4.x + обеспечивает встроенную поддержку для чтения и записи данных Apache Avro, но модуль spark-avro является внешним и по умолчанию не включен в spark-submit или spark-shell, вам следует убедиться, что вы используете одну и ту же версию Scala (например, 2.12) для spark-shell и --packages.


Причина исключения в том, что вы используете spark-shell из Spark, созданного для Scala 2.11.12, а --packages указывает зависимость от Scala 2.12 (в org.apache.spark:spark-avro_2.12:2.4.0).

Используйте --packages org.apache.spark:spark-avro_2.11:2.4.0, и все будет в порядке.

person Community    schedule 19.07.2019

на всякий случай, если кому-то интересны pyspark 2.7 и Spark 2.4.3

ниже пакет работает

bin/pyspark --packages org.apache.spark:spark-avro_2.11:2.4.3
person Suresh    schedule 13.08.2019

Еще одна вещь, которую я заметил, когда у меня возникла такая же проблема, - это то, что она работает нормально в первый раз и после этого показывает ошибку. Итак, очистите кеш, добавив команду rm в файл докера. В моем случае этого было достаточно.

person Sowmya    schedule 10.03.2020