hiveodbc和prepared语句:parseexception

zzzyeukh  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(362)

背景: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
unguejic

unguejic1#

简而言之,hiveodbc驱动程序有很多问题。其中之一是,在出现任何错误时,它都会将查询按原样发送到hive,hive会抱怨它发现的第一个问号,而不管实际问题是什么。
如果在odbc驱动程序中启用了日志记录,就可以找到真正的问题(而且有很多问题)。

相关问题