Search code examples
pythonjdbcapache-drilljpypejaydebeapi

Python: JDBC Connection Error to Apache Drill Error with JayDeBeApi


I am trying to connect to Apache Drill from python using jaydebeapi library.

I have turned on drill in embedded mode via drill-embedded, and the web ui runs correctly in port 8047. Then, I am trying to connect via JDBC through a python script:

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'
)

but I get this error

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.

Does anyone knows how to solve the issue?


Solution

  • Thanks to @Luke Woodward suggestion, the problem was the port. For drill-embedded there is no port to select. Below a full query example

    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()