用于 SQLAlchemy 的 Apache Drill
项目描述
SQLAlchemy 的 Apache Drill 方言。
这样做的主要目的是为 Apache Drill 提供一个可以与 Apache Superset 一起使用的工作方言。
https://superset.incubator.apache.org
显然,Drill 的一个有效的、健壮的方言也有其他用途,但是这个 REPO 的大部分迭代计划将基于使用 Superset。只要不影响 Superset 集成,我们很乐意合并其他更改。
安装
安装方言很简单。简单地:
pip install sqlalchemy-drill
或者,您可以从 github 下载最新版本并从此处安装:
python3 -m pip install git+https://github.com/JohnOmernik/sqlalchemy-drill.git
与 REST 一起使用
对于 Drill >= 1.19,Drill 的 REST API 可以使用流式传输到 JSON 的结果执行查询,该结果通过分块 HTTP 返回,否则会缓冲结果,然后在传统的 HTTP 响应中返回。连接到 Drill over REST 的 SQLAlchemy URL 如下所示。
drill+sadrill://<username>:<password>@<host>:<port>/<storage_plugin>?use_ssl=True
要连接到在嵌入式模式下运行的本地机器上运行的 Drill,您可以使用以下连接字符串。
drill+sadrill://localhost:8047/dfs?use_ssl=False
支持的 URL 查询参数
| 范围 | 类型 | 描述 |
|---|---|---|
| 使用_ssl | 布尔值 | 是否使用 HTTPS 连接到 Drill |
| verify_ssl | 布尔值 | 是否验证服务器的 TLS 证书 |
| impersonation_target[1] | 细绳 | 要被此连接模拟的 Drill 用户的用户名 |
[1] 需要一个包含 DRILL-8168 修复程序的 Drill。
尾随元数据
Drill REST API 返回的查询结果元数据存储在result_mdDB-API Cursor 对象的字段中。请注意,任何尾随元数据,即出现在结果行数据之后的元数据,只有在您遍历所有返回的行之后才会被填充。如果您需要此尾随元数据,您可以通过事先获取对它的引用来使光标对象在完全迭代后可访问,如下所示。
r = engine.execute('select current_timestamp')
r.cursor.result_md # access metadata, but only leading metadata
cur = r.cursor # obtain a reference for use later
r.fetchall() # iterate through all result data
cur.result_md # access metadata, including trailing metadata
del cur # optionally delete the reference when done
钻头 < 1.19
在 1.19 之前的 Drill 版本中,所有数据值都被序列化为 JSON 字符串,并且列类型元数据位于数据本身之后。因此,对于这些版本的 Drill,drill+sadrill 方言将每个数据值作为字符串返回。要将非字符串数据转换为其本机类型,您需要自己进行类型转换。
钻头 >= 1.19
在 Drill 1.19 中,REST API 开始使用 JSON 中的数字类型来表示数字和时间,后者通过 UNIX 时间表示,而列类型元数据被移动到结果数据之前。因此,当与 Drill >= 1.19 一起使用时,drill+sadrill 方言能够返回适当的数字和时间类型。
与 JDBC 一起使用
通过 JDBC 连接到 Drill 比本地安装要复杂一些,完整的说明可以在 Drill 文档中找到:https ://drill.apache.org/docs/using-the-jdbc-driver/ 。
为了将 SQLAlchemy 配置为通过 JDBC 使用 Drill,您必须:
- 在此处下载最新的 JDBC 驱动程序:http: //apache.osuosl.org/drill/
- 将此驱动程序复制到您的类路径或其他已知路径
- 将环境变量设置为
DRILL_JDBC_DRIVER_PATH驱动程序位置的完整路径 - 设置一个名为Drill 驱动程序文件
DRILL_JDBC_JAR_NAME名的环境变量。.jar
此外,您还需要安装JayDeBeApijPype 0.6.3 版。这些模块被列为可选依赖项,默认安装程序不会安装这些模块。
如果 JDBC 驱动程序不可用,则方言在尝试连接时会抛出错误。此外,sqlalchemy-drill 不会为您启动 JVM,因此您需要自己通过调用 JPype 来执行此操作,如下所示。有关工作示例,请参阅此 repo 中的文件 test-jdbc.py。
jpype.startJVM("-ea", classpath="lib/*")
drill+jdbc://<username>:<passsword>@<host>:<port>
对于简单的安装,这可能如下所示:
drill+jdbc://admin:password@localhost:31010
与 ODBC 一起使用
为了将 SQLAlchemy 配置为通过 ODBC 与 Drill 一起工作,您必须:
- 安装最新的 Drill ODBC 驱动程序:https ://drill.apache.org/docs/installing-the-driver-on-linux/
- 确保您的系统中具有 ODBC 支持(
unixODBC基于 RedHat 的系统的软件包)。 - 安装
pyodbcPython 包。此模块被列为可选依赖项,默认安装程序不会安装。
要使用 SQLAlchemy 连接到 Drill,请使用以下连接字符串:
drill+odbc:///?<ODBC connection parameters>
官方文档中提供了连接属性:https ://drill.apache.org/docs/odbc-configuration-reference/
对于简单的安装,这可能如下所示:
drill+odbc:///?Driver=/opt/mapr/drill/lib/64/libdrillodbc_sb64.so&ConnectionType=Direct&HOST=localhost&PORT=31010&AuthenticationType=Plain&UID=admin&PWD=password
或者对于您在以下位置配置 DSN 的情况odbc.ini:
drill+odbc:///?DSN=drill_dsn_name
注意:最好避免使用带有hostname:port或username/的连接字符串password,例如 'drill+odbc://admin:password@localhost:31010/' 但只使用 ODBC 属性以避免这些参数之间的任何误解。
与超集一起使用
有关如何将 Superset 与 Drill 一起使用的完整教程,请阅读 @cgivre 博客上的教程:http: //thedataist.com/visualize-anything-with-superset-and-drill/。
现状/发展思路
目前,我们可以连接到钻取,并对大多数可视化进行查询并获得结果。我们还列举了一些表的表列。以下是一些需要解决的更大问题。(个别问题在issues下跟踪)
- 通过 Superset 中的数据库选项卡连接到 Drill 成功
- 您可以对大多数类型的可视化项/表进行基本查询
- 高级查询/联接可能存在问题。当您了解新问题时,请跟踪问题
非常感谢
使用drillpy和pydrill获取用于创建原始drilldbapi.py连接代码的代码!
码头工人
建议扩展官方 Docker 镜像以包含此 Apache Drill 驱动程序:
FROM apache/superset
# Switching to root to install the required packages
USER root
RUN pip install git+https://github.com/JohnOmernik/sqlalchemy-drill.git
# Switching back to using the `superset` user
USER superset
项目详情
sqlalchemy_drill -1.1.2.tar.gz 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | e4d44f65b89d80e1d594caf739ef10cbafc722b174300bf8d6a80cf515a33ee9 |
|
| MD5 | d523e6e96ae5d6f1f1c39d26d7073d8a |
|
| 布莱克2-256 | 930c8236efc6db99bd8ef238cac53be8f99bf5f93442668fdd349fc43c68a8dd |