python - 带有准备好的语句的 Hive odbc:ParseException
问题描述
上下文:Hive3,HDP 3.1。在 Windows 和 Linux 下使用 Python/odbc(官方 HDP 驱动程序)完成的测试。
我运行了以下查询:
- “选择?作为 lic,?作为 cpg”
- “选择 * 从(选择?作为 lic,?作为 cpg)作为 t”
- “与 init as (select ? as lic, ? as cpg) select * from init”,
1)和2)工作正常,并给我预期的结果。3 给了我一个 ParseException :
编译语句时出错:失败:ParseException 行 1:21 无法识别“?”附近的输入 '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
解决方案
总之,Hive ODBC 驱动程序有很多问题。其中之一是,在出现任何错误时,它将按原样将查询发送到 hive,无论实际问题是什么,它都会抱怨它找到的第一个问号。
如果在 odbc 驱动程序中启用了日志记录,则可以找到真正的问题(并且有很多问题)。
推荐阅读
- c - FILE 结构中未使用的变量
- ios - AFNetworking 3.2.0 ' 配置的安全策略只能应用于具有安全基本 URL(即 https)的管理器
- javascript - javascript 超时如何在执行堆栈中工作?
- reactjs - Material-UI:长文本包裹在网格中
- python - 如何仅操作属于 Pandas DataFrame 中对象列表的某些元素
- ruby-on-rails - 检查 RSpec 中仅在创建时运行的自定义验证
- excel - 识别模式并提取子字符串
- python - mpl_to_plotly 没有显示预期的图例
- magento - 如何在 Magento 中导出类别描述
- drupal - drupal8:如何安装模块?