Как добавить пользовательские диалекты JDBC в PySpark

У меня есть собственный диалект JDBC в Scala, который работает безупречно registerDialect метод в Scala Spark API. Я надеялся использовать тот же класс в PySpark, получив к нему доступ через

sc._jvm.org.apache.spark.sql.jdbc.JdbcDialects.registerDialect(sc._jvm.com.me.MyJDBCDialect)

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

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1124, in __call__
  File "/usr/local/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1094, in _build_args
  File "/usr/local/spark/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py", line 289, in get_command_part
  File "/usr/local/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1363, in __getattr__
 py4j.protocol.Py4JError: com.me.MyJDBCDialect._get_object_id does not exist in the JVM

Я совершенно незнаком с Py4J, но это звучит как _get_object_id ошибка возникает с sc._jvm.com.me.MyJDBCDialect это объект Python, и я пытаюсь передать его sc._jvm.org.apache.spark.sql.jdbc.JdbcDialects.registerDialect, который является Java(?) конструкцией. Как мне обойти эту проблему?

1 ответ

Это сработало для меня:

Убедитесь, что ваш диалект объявлен как classне object

from py4j.java_gateway import java_import

gw = spark.sparkContext._gateway
java_import(gw.jvm, "com.me.MyJDBCDialect")
gw.jvm.org.apache.spark.sql.jdbc.JdbcDialects.registerDialect(
  gw.jvm.com.me.MyJDBCDialect())

Обратите внимание () - это вызовет конструктор класса для вашего диалекта

Другие вопросы по тегам