я написал следующее 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
Что бы лучший способ приблизиться к этому? Благодаря!
Спасибо! В принципе, MyUtitlity.java несколько сложнее, и мы действительно НЕ хотим перекодировать его в python. Есть ли способ вызвать MyUtility.java из задания pyspark? Мы не обязательно должны использовать Py4J, если есть другой вариант ... – Edamame
Ну, многое зависит от вашей архитектуры и кода. Вероятно, самым простым и относительно эффективным решением является «передать» данные в код Java и прочитать результат. В качестве альтернативы вы можете передавать данные через диск (это в основном то, как драйвер PySpark использовал для обработки вещей, хотя я думаю, что это уже не так, или, может быть, это так). Наиболее сложным решением является постоянный (или временный, например, при жизни исполнитель) Java-процесс, который обрабатывает запросы. – zero323
Как правильно регистрировать банки как у водителя, так и у работников? Затем сделать флешки Python в баночках для правильного вызова драйвера? –