背景:hive3,hdp3.1。在windows和linux下用python/odbc(官方hdp驱动程序)进行的测试。
我运行了以下查询:
“选择?作为lic?作为cpg”
“选择自(选择?作为lic?作为cpg)作为t“
“初始化为(选择?作为lic?作为cpg)选择from init“,
1) 2)做得好,给我预期的结果。3给了我一个例外:
编译语句时出错:失败:parseexception行1:21无法将“?”附近的输入识别为select子句(80)(sqlprepare)中的“lic”
与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
1条答案
按热度按时间unguejic1#
简而言之,hiveodbc驱动程序有很多问题。其中之一是,在出现任何错误时,它都会将查询按原样发送到hive,hive会抱怨它发现的第一个问号,而不管实际问题是什么。
如果在odbc驱动程序中启用了日志记录,就可以找到真正的问题(而且有很多问题)。