Как добавить пользовательские диалекты 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())
Обратите внимание ()
- это вызовет конструктор класса для вашего диалекта