代码之家  ›  专栏  ›  技术社区  ›  Guillaume

带准备语句的Hive ODBC:ParseException

  •  0
  • Guillaume  · 技术社区  · 6 年前

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

    我运行了以下查询:

    1. “选择?作为LIC,?作为CpG“
    2. “选择*从(选择?作为LIC,?作为CpG的“T”
    3. “用init as(选择?作为LIC,?as cpg)选择*from init“,

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

    编译语句时出错:失败:ParseException行1:21 无法识别“?”附近的输入。作为select子句(80)中的“lic” (Sql准备)

    与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 回复  |  直到 6 年前
        1
  •  0
  •   Guillaume    6 年前

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

    如果在ODBC驱动程序中启用了日志记录,则会发现真正的问题(其中有许多问题)。