Hive odbc с подготовленными операторами: ParseException

Контекст: Hive3, HDP 3.1. Тесты проводились с помощью Python/odbc (официальный драйвер HDP) под Windows и Linux.

Я выполнил следующие запросы:

  1. "выбрать? как лицензию,? как cpg"
  2. "выберите * из (выберите? как lic,? как cpg) как t"
  3. "с инициализацией как (выберите? как lic,? как cpg) выберите * из инициализации",

1) и 2) работают нормально и дают ожидаемый результат. 3 дает мне ParseException :

Error while compiling statement: FAILED: ParseException line 1:21 cannot recognize input near '?' 'as' 'lic' in select clause (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 есть инструменты для тестирования кода, такие как библиотека unittest.


53
1

Ответ:

Решено

Короче говоря, у драйвера Hive ODBC много проблем. Один из них заключается в том, что при любой ошибке он отправляет запрос как есть в куст, который будет жаловаться на первый найденный вопросительный знак, независимо от того, в чем проблема.

Если в odbc-драйвере включено логирование, можно найти настоящую проблему (а их много).