Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:JDBC连接到Apache的连接错误,JayDeBeApi错误_Python_Jdbc_Apache Drill_Jpype_Jaydebeapi - Fatal编程技术网

Python:JDBC连接到Apache的连接错误,JayDeBeApi错误

Python:JDBC连接到Apache的连接错误,JayDeBeApi错误,python,jdbc,apache-drill,jpype,jaydebeapi,Python,Jdbc,Apache Drill,Jpype,Jaydebeapi,我正在尝试使用jaydebeapi库从python连接到Apache Drill 我已经通过drill embedded打开了嵌入式模式下的drill,web ui在端口8047中正确运行。然后,我尝试通过一个python脚本通过JDBC进行连接: import jaydebeapi import jpype import os DRILL_HOME = os.environ["DRILL_HOME"] classpath = DRILL_HOME + "/ja

我正在尝试使用
jaydebeapi
库从python连接到Apache Drill

我已经通过
drill embedded
打开了嵌入式模式下的drill,web ui在端口8047中正确运行。然后,我尝试通过一个python脚本通过JDBC进行连接:

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.
SLF4J:未能加载类“org.SLF4J.impl.StaticLoggerBinder”。
SLF4J:默认为无操作(NOP)记录器实现
SLF4J:参见http://www.slf4j.org/codes.html#StaticLoggerBinder 详情请参阅。
回溯(最近一次呼叫最后一次):
文件“jaydebe_drill.py”,第10行,在
'jdbc:drill:drillbit=localhost:8047'
文件“/Users/user/opt/anaconda3/lib/python3.7/site packages/jaydebeapi/_init__.py”,第412行,
连接
jconn=\ujdbc\uconnect(jclassname、url、驱动程序参数、jars、libs)
文件“/Users/user/opt/anaconda3/lib/python3.7/site packages/jaydebeapi/_init__.py”,第230行,
在jdbc\u connect\u jpype中
返回jpype.java.sql.DriverManager.getConnection(url,*dargs)
jpype.\u jexception.sqlnonTransientConnectionExceptionPraisable:
java.sql.SQLNonTransientConnectionException:
连接到钻孔失败:oadd.org.apache.Drill.exec.rpc.ChannelClosedException:
通道关闭/127.0.0.1:62244本地主机/127.0.0.1:8047。

有人知道如何解决这个问题吗?

多亏了@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()

(1) 您是否能够仅使用Java和JDBC连接到Drill,即不使用python和JayDeBeApi?(2) Drill本身(而不是web界面)使用什么端口?文档建议使用端口2181或5181。尝试将JDBC驱动程序连接到端口8047上的web接口将永远无法工作,并且可能会引发随机网络错误,如您看到的错误。感谢您的帮助。显然,问题确实出在连接端口上。对于
drill embedded
,没有可选择的端口。我在补充一个答案