Доступ к функции scala в PySpark - PullRequest
0 голосов
/ 15 января 2019

У меня есть библиотека Scala, которая содержит некоторые служебные коды и UDF для API Scala Spark. Тем не менее, я хотел бы сейчас начать использовать эту библиотеку Scala с PySpark. Использование классов на основе Java, кажется, работает довольно хорошо, как описано Запуск пользовательского класса Java в PySpark , однако, поскольку я использую библиотеку, написанную на Scala, некоторые имена некоторых классов могут быть не прямыми и содержать символы, такие как $.

Как совместимость все еще возможна?

Как я могу использовать код Java / Scala, который предлагает функцию, требующую универсального параметра типа?

1 Ответ

0 голосов
/ 15 января 2019

В общем, нет. Хотя доступ в таких случаях иногда возможен, используя __getattribute__ / getattr, Py4j просто не разработан с учетом Scala (это на самом деле не является специфичным для Python - хотя технически Scala допускает интерполяцию с Java, это гораздо более богатый язык, и многие из его функций не легко доступны из других языков JVM).

На практике вы должны делать то же самое, что и Spark для внутреннего использования - вместо непосредственного предоставления Scala API вы создаете простой * Java или Scala API, который специально разработан для взаимодействия с гостевыми языками. Поскольку Py4j обеспечивает перевод только между основными типами Python и Java и не обрабатывает обычно используемые интерфейсы Scala, такой промежуточный уровень вам все равно понадобится, если только библиотека Scala не была специально разработана для взаимодействия Java.

По вашему последнему беспокойству

Как я могу использовать код Java / Scala, который предлагает функцию, требующую универсального параметра типа?

Py4j может нормально обрабатывать дженерики Java без какой-либо специальной обработки. Расширенные функции Scala (манифесты, теги классов, теги типов) обычно не нужны, но, опять же, они не разработаны (хотя это возможно) с учетом взаимодействия с Java.


* Как правило, если что-то дружественное к Java (не требует каких-либо сумасшедших взломов, обширных преобразований типов или заполнения пробелов, обычно обрабатываемых компилятором Scala), это также должно хорошо подходить для PySpark. .

...