2016-02-28 4 views
1

я написал следующее MyPythonGateway.java, так что я могу назвать свой собственный класс Java с Python:pyspark: вызов пользовательской функции java из pyspark. Нужен ли мне Java_Gateway?

public class MyPythonGateway { 

    public String findMyNum(String input) { 
     return MyUtiltity.parse(input).getMyNum(); 
    } 

    public static void main(String[] args) { 
     GatewayServer server = new GatewayServer(new MyPythonGateway()); 
     server.start(); 
    } 
} 

и вот как я использовал его в своем коде Python:

def main(): 

    gateway = JavaGateway()     # connect to the JVM 
    myObj = gateway.entry_point.findMyNum("1234 GOOD DAY") 
    print(myObj) 


if __name__ == '__main__': 
    main() 

Теперь я хочу использовать функцию MyPythonGateway.findMyNum() от PySpark, а не только отдельный скрипт python. Я сделал следующее:

myNum = sparkcontext._jvm.myPackage.MyPythonGateway.findMyNum("1234 GOOD DAY") 
print(myNum) 

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

... line 43, in main: 
myNum = sparkcontext._jvm.myPackage.MyPythonGateway.findMyNum("1234 GOOD DAY") 
    File "/home/edamameQ/spark-1.5.2/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", line 726, in __getattr__ 
py4j.protocol.Py4JError: Trying to call a package. 

Так что же я скучаю здесь? Я не знаю, должен ли я запускать отдельную JavaApplication MyPythonGateway для запуска сервера шлюза при использовании pyspark. Пожалуйста посоветуй. Благодаря!


Ниже именно то, что мне нужно:

input.map(f) 

def f(row): 
    // call MyUtility.java 
    // x = MyUtility.parse(row).getMyNum() 
    // return x 

Что бы лучший способ приблизиться к этому? Благодаря!

ответ

2

Прежде всего ошибка, которую вы видите, обычно означает, что класс, который вы пытаетесь использовать, недоступен. Поэтому, скорее всего, это вопрос CLASSPATH.

Что касается общей идеи есть два важных вопроса:

  • вы не можете получить доступ к SparkContext внутри действия или преобразования так, используя PySpark шлюз не будет работать (см How to use Java/Scala function from an action or a transformation? для некоторых деталей)). Если вы хотите использовать Py4J у рабочих, вам придется запускать отдельные шлюзы на каждом рабочем компьютере.
  • Вы действительно не хотите передавать данные между Python и JVM таким образом. Py4J не предназначен для задач с интенсивным использованием данных.
+0

Спасибо! В принципе, MyUtitlity.java несколько сложнее, и мы действительно НЕ хотим перекодировать его в python. Есть ли способ вызвать MyUtility.java из задания pyspark? Мы не обязательно должны использовать Py4J, если есть другой вариант ... – Edamame

+0

Ну, многое зависит от вашей архитектуры и кода. Вероятно, самым простым и относительно эффективным решением является «передать» данные в код Java и прочитать результат. В качестве альтернативы вы можете передавать данные через диск (это в основном то, как драйвер PySpark использовал для обработки вещей, хотя я думаю, что это уже не так, или, может быть, это так). Наиболее сложным решением является постоянный (или временный, например, при жизни исполнитель) Java-процесс, который обрабатывает запросы. – zero323

+0

Как правильно регистрировать банки как у водителя, так и у работников? Затем сделать флешки Python в баночках для правильного вызова драйвера? –

 Смежные вопросы

  • Нет связанных вопросов^_^