Как использовать пакет spark-avro для чтения файла avro из spark-shell? - PullRequest
4 голосов
/ 26 апреля 2019

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

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

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

enter image description here

1 Ответ

2 голосов
/ 19 июля 2019

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, и выдолжно быть хорошо.

...