上下文:Hive3,HDP 3.1。在Windows和Linux下使用Python/odbc(官方HDP驱动程序)完成的测试。
我运行了以下查询:
- "选择?作为 lic, ?作为CPG"
- "选择 * 从 (选择 ?作为 lic, ?作为 CPG) 作为 T"
- "使用 init as (选择 ?作为 lic, ?作为 CPG) 从初始化中选择 *",
1)和2)工作正常,并给我预期的结果。3给了我一个解析异常:
编译语句时出错:失败:解析异常行 1:21 无法识别"?"附近的输入选择条款中的"作为"lic"(80) (SQLPrepare)")
在java/jdbc上运行的完全相同的语句工作正常。请注意,2) 看起来像是 3) 的解决方法,但它适用于这个小示例,不适用于更大的查询。
我可以做些什么来使 ODBC 按预期工作?或者,在哪里可以找到 ODBC 驱动程序的限制?
对于完整上下文,完整测试代码如下所示:
cnxnstr = 'DSN=HiveProd'
cnxn = pyodbc.connect(cnxnstr, autocommit=True)
cursor = cnxn.cursor()
queries = [
"with init as (select ? as lic, ? as cpg) select * from init",
"select 2 * ? as lic, ? as cpg",
"select * from (select ? as lic, ? as cpg) as t",
]
for q in queries:
print("nExecuting " + q)
try:
cursor.execute(q, '1', '2')
except pyodbc.ProgrammingError as e:
print(e)
continue
简而言之,Hive ODBC 驱动程序有很多问题。其中之一是,在任何错误时,它将按原样将查询发送到 hive,无论实际问题是什么,蜂巢都会抱怨它发现的第一个问号。
如果在 odbc 驱动程序中启用了日志记录,则可以找到真正的问题(其中有很多)。