带有预处理语句的Hive odbc:ParseException

问题描述 投票:0回答:1

背景:Hive3,HDP 3.1。在Windows和Linux下使用Python / odbc(官方HDP驱动程序)进行的测试。

我运行了以下查询:

  1. “选择?作为lic,?作为cpg”
  2. “select * from(select?as lic,?as cpg)as t”
  3. “使用init as(select?as lic,?as cpg)select * from init”,

1)和2)工作正常,给我预期的结果。 3给我一个ParseException:

编译语句时出错:FAILED:ParseException行1:21无法识别'?'附近的输入select as子句中的'as''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
python hive odbc
1个回答
0
投票

简而言之,Hive ODBC驱动程序存在很多问题。其中之一是,在任何错误上,它会将查询原样发送到hive,无论实际问题是什么,它都会抱怨它找到的第一个问号。

如果在odbc驱动程序中启用了日志记录,则可以找到真正的问题(并且有很多问题)。

© www.soinside.com 2019 - 2024. All rights reserved.