具有预准备语句的配置单元odbc:ParseException

时间:2019-01-28 07:05:27

标签: python hive odbc

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

我运行了以下查询:

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

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

  

编译语句时出错:失败:ParseException行1:21   无法识别“?”附近的输入select子句(80)中的'as''lic'   (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

1 个答案:

答案 0 :(得分:0)

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

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