#python #jdbc #apache-drill #jpype #jaydebeapi
#python #jdbc #apache-drill #jpype #jaydebeapi
Вопрос:
Я пытаюсь подключиться к Apache Drill из python, используя jaydebeapi
библиотеку.
Я включил детализацию во встроенном режиме через drill-embedded
, и веб-интерфейс корректно работает в порту 8047. Затем я пытаюсь подключиться через JDBC с помощью скрипта python:
import jaydebeapi
import jpype
import os
DRILL_HOME = os.environ["DRILL_HOME"]
classpath = DRILL_HOME "/jars/jdbc-driver/drill-jdbc-all-1.17.0.jar"
jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.class.path=%s" % classpath)
conn = jaydebeapi.connect(
'org.apache.drill.jdbc.Driver',
'jdbc:drill:drillbit=localhost:8047'
)
но я получаю эту ошибку
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Traceback (most recent call last):
File "jaydebe_drill.py", line 10, in <module>
'jdbc:drill:drillbit=localhost:8047'
File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/jaydebeapi/__init__.py", line 412,
in connect
jconn = _jdbc_connect(jclassname, url, driver_args, jars, libs)
File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/jaydebeapi/__init__.py", line 230,
in _jdbc_connect_jpype
return jpype.java.sql.DriverManager.getConnection(url, *dargs)
jpype._jexception.SQLNonTransientConnectionExceptionPyRaisable:
java.sql.SQLNonTransientConnectionException:
Failure in connecting to Drill: oadd.org.apache.drill.exec.rpc.ChannelClosedException:
Channel closed /127.0.0.1:62244 <--> localhost/127.0.0.1:8047.
Кто-нибудь знает, как решить проблему?
Комментарии:
1. (1) Можете ли вы подключиться к Drill, используя только Java и JDBC, т. Е. Без использования python и JayDeBeApi? (2) Какой порт использует сама детализация, а не веб-интерфейс? В документации предлагается порт 2181 или 5181. Попытка подключить драйвер JDBC к веб-интерфейсу через порт 8047 никогда не будет работать и, скорее всего, вызовет случайные сетевые ошибки, такие как та, которую вы видите.
2. Спасибо за помощь. По-видимому, проблема действительно в порту подключения. Ибо
drill-embedded
нет порта для выбора. Я добавляю ответ
Ответ №1:
Благодаря предложению @Luke Woodward проблема заключалась в порту. Ибо drill-embedded
нет порта для выбора. Ниже приведен полный пример запроса
import jaydebeapi
import jpype
import os
import pandas as pd
DRILL_HOME = os.environ["DRILL_HOME"]
classpath = DRILL_HOME "/jars/jdbc-driver/drill-jdbc-all-1.17.0.jar"
jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.class.path=%s" % classpath)
conn = jaydebeapi.connect(
'org.apache.drill.jdbc.Driver',
'jdbc:drill:drillbit=localhost'
)
cursor = conn.cursor()
query = """
SELECT *
FROM dfs.`/Users/user/data.parquet`
LIMIT 1
"""
cursor.execute(query)
columns = [c[0] for c in cursor.description]
data = cursor.fetchall()
df = pd.DataFrame(data, columns=columns)
df.head()