Передача данных из scala в python с использованием JEP - PullRequest
1 голос
/ 12 мая 2019

Вот что я пытаюсь сделать:

  1. Я читаю данные в scala
  2. Извлекаю несколько столбцов
  3. Используя JEP, передаю созданный кадр данных в Pythonscript
  4. Python-скрипт, преобразующий фрейм данных в pandas, выполняет некоторую операцию и возвращает ее обратно

Однако я не уверен, как передать фрейм данных в скрипт python.Вот сценарий Python (это просто пример сценария, а не фактический):

import findspark
findspark.init()
import pandas as pd
#from pyspark.sql import types.*
from pyspark.sql import DataFrame as dataframe

def tes(df: dataframe):
    df = df.toPandas()
    df['concatenate'] = df['country'] + df['datasourceProvidedCountry']
    return dataframe(df)

, и он продолжает сбой со следующей ошибкой:

jep.JepException: <class 'ImportError'>: py4j.protocol
  at /usr/local/lib64/python3.6/site-packages/jep/java_import_hook.__getattr__(java_import_hook.py:57)
  at /home/hadoop/testpy.<module>(testpy.py:5)
  at jep.Jep.run(Native Method)
  at jep.Jep.runScript(Jep.java:359)
  at jep.Jep.runScript(Jep.java:335)
  ... 49 elided
Caused by: java.lang.ClassNotFoundException: py4j.protocol
  at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  ... 52 more
spark-shell --conf spark.driver.extraLibraryPath=:/usr/local/lib64/python3.6/site-packages/jep:/usr/local/lib/python3.6/site-packages/py4j/ --jars /home/hadoop/jep-3.8.2.jar

может кто-нибудь посоветоватькак я могу передать фрейм данных из scala в pyspark с помощью Jep (если это дубликат, укажите мне на нужный поток, потому что я не смог его найти)?

1 Ответ

1 голос
/ 18 июля 2019

У меня такое же требование и я тоже пробовал с Jep.К сожалению, Jep не работает для этого варианта использования.

Не найденный py4j.protocol вызван Jep ClassEnquirer, когда и python, и jave имеют библиотеку с одинаковым именем, Jep будет рассматривать библиотеку java.Вы можете решить эту проблему, исключив py4j из пакета spark из вашего java-приложения или создав настраиваемый ClassEnquirer для рассмотрения python py4j.

Вам также необходимо обновить конструктор Jep, установить для значения useSubInterpreter значение false и перестроить его.

public Jep(JepConfig config) throws JepException {
    this(config, false);
}

Теперь ошибка должна быть устранена.Тем не менее, передача объекта в функцию python - это объект PyObject, содержащий ссылку на Java, который не является объектом фрейма данных pyspark, поэтому он не имеет функции toPandas ().

Альтернативным способом может быть использование gRPC илиApache Thrift, вы можете проверить документ для более подробной информации.

...