Запуск пользовательского класса Java в PySpark

Я пытаюсь запустить пользовательский класс чтения HDFS в PySpark. Этот класс написан на Java, и мне нужно получить к нему доступ из PySpark, либо из оболочки, либо с помощью spark-submit.

В PySpark я извлекаю JavaGateway из SparkContext ( sc._gateway ).

Скажем, у меня есть класс:

 package org.foo.module public class Foo { public int fooMethod() { return 1; } } 

Я попытался упаковать его в банку и передать его с параметром --jar в pyspark, а затем запустить:

 from py4j.java_gateway import java_import jvm = sc._gateway.jvm java_import(jvm, "org.foo.module.*") foo = jvm.org.foo.module.Foo() 

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

 Py4JError: Trying to call a package. 

Может кто-нибудь помочь с этим? Благодарю.

3 Solutions collect form web for “Запуск пользовательского класса Java в PySpark”

Проблема, которую вы описали, обычно указывает на то, что org.foo.module не находится в драйвере CLASSPATH. Одним из возможных решений является использование spark.driver.extraClassPath для добавления файла jar. Его можно, например, установить в conf/spark-defaults.conf или предоставить в качестве параметра командной строки.

На стороне примечание:

  • если класс, который вы используете, является настраиваемым форматом ввода, не должно быть необходимости использовать шлюз Py4j. Вы можете просто использовать SparkContext.hadoop* / SparkContext.newAPIHadoop* .

  • использование java_import(jvm, "org.foo.module.*") выглядит плохой идеей. Вообще говоря, вы должны избегать ненужного импорта на JVM. Это не публика по какой-то причине, и вы действительно не хотите вступать в это с этим. Особенно, когда вы получаете доступ таким образом, чтобы этот импорт полностью устарел. Поэтому java_import и придерживайтесь jvm.org.foo.module.Foo() .

В PySpark попробуйте следующее

 from py4j.java_gateway import java_import java_import(sc._gateway.jvm,"org.foo.module.Foo") func = sc._gateway.jvm.Foo() func.fooMethod() 

Удостоверьтесь, что вы скомпилировали свой Java-код в исполняемую банку и отправили искр так,

 spark-submit --driver-class-path "name_of_your_jar_file.jar" --jars "name_of_your_jar_file.jar" name_of_your_python_file.py 

Вместо --jars вам следует использовать --packages для импорта пакетов в действие spark-submit .

  • OutOfMemoryError при использовании PySpark для чтения файлов в локальном режиме
  • Искры RDD для Python DataFrame
  • используя foreachRDD и foreach для итерации по rdd в pyspark
  • pyspark Линейная регрессия Пример из официальной документации - Плохие результаты?
  • Численное и статическое связывание
  • Как использовать класс Scala внутри Pyspark
  • Apyspyspark с использованием oracle jdbc для вывода данных. Драйвер не найден
  • Как я могу преобразовать pyspark.sql.dataframe.DataFrame обратно в таблицу sql в записной книжке databricks
  • Python - лучший язык программирования в мире.