我正在尝试通过 ODBC 连接到 Databricks 集群,以从本地 python 脚本运行一些 SQL 查询。
我遵循 将 Python 和 pyodbc 连接到 Databricks 指南,我能够从示例 (
samples
) 中给出的 SELECT * FROM samples.nyctaxi.trips LIMIT 10
表中获取数据。
即使我将查询更改为 s3 存储桶中的一个读数,我也会收到此错误:
cursor.execute("SELECT * FROM delta.`s3:/my-bucket/some/path/to/dataset/` limit 10")
pyodbc.ProgrammingError: ('42S02', '[42S02] [Simba][SQLEngine] (31740) Table or view not found: .delta.s3://my-bucket/some/path/to/dataset/ (31740) (SQLExecDirectW)')
从同一集群上的 Databricks Notebook 执行时,相同的查询可以工作。
我需要设置一些特殊属性吗? ODBC 驱动程序是否遇到反引号 (`) 问题?
我正在运行 Databricks 指南中的完全相同的 saem 代码:
import pyodbc
import os
conn = pyodbc.connect(
"Driver=/Library/simba/spark/lib/libsparkodbc_sb64-universal.dylib;" +
f"Host={os.getenv('DATABRICKS_HOST')};" +
"Port=443;" +
f"HTTPPath={os.getenv('DATABRICKS_HTTP_PATH')};" +
"SSL=1;" +
"ThriftTransport=2;" +
"AuthMech=3;" +
"UID=token;" +
f"PWD={os.getenv('DATABRICKS_TOKEN')}",
autocommit = True
)
# Run a SQL query by using the preceding connection.
cursor = conn.cursor()
cursor.execute("SELECT * FROM samples.nyctaxi.trips")
# Print the rows retrieved from the query.
for row in cursor.fetchall():
print(row)
Databricks ODBC 文档页面提及:
ODBC 驱动程序接受 ANSI SQL-92 方言的 SQL 查询,并将查询转换为 Databricks SQL 方言。但是,如果您的应用程序直接生成 Databricks SQL,或者您的应用程序使用特定于 Databricks 的任何非 ANSI SQL-92 标准 SQL 语法,Databricks 建议您将 UseNativeQuery=1 设置为连接配置。通过该设置,驱动程序将 SQL 查询逐字传递到 Databricks。
像
select from delta.path
这样明显特定的结构可以使用这种机制重写(损坏)。我不确定这是一个驱动程序错误还是只是一些 ODBC 细节。无论如何,按照此处的建议,将 UseNativeQuery=1
添加到连接字符串将防止此问题。