如何使用 jinjasql 在 hive 上执行查询
How to execute query on hive with jinjasql
是否可以使用 jinjasql 和 pyhive 执行 hive 查询?
当我尝试它时,出现以下错误。
pyhive.exc.ProgrammingError: Unsupported param format:
odict_values(['XXXXXXX'])
我可以使用 jinjasql 和 pyhive 执行查询,但我需要同时使用两者来防止 sql 注入。
环境(都在同一个虚拟机上。)
- Hortonworks 沙盒上的 Hortonworks 数据平台 (HDP®) 2.6.4
VirtualBox
- Jinjasql 0.1.6
- PyHive 0.5.1
- Python 3.5.5
Pyhive 在参数中支持列表、元组和字典。虽然 jinjasql 支持多参数样式,并且如文档中所述 here
它应该 return 一个列表,除了 'named' 或 'pyformat' 会 return 一个字典。由于 Jinjasql 创建了一个 Ordereddict,它抛出了这个异常。解决方案应该是使用 return 列表的参数样式。
希望这对您有所帮助:)
更新 python 3:
在 python 3 中,您必须将参数转换为 dict.values() returns 字典值的 view 列表。
正如您提到的,PyHive 允许列表作为执行参数,我按照您的建议使用列表函数将 bind_params 转换为列表。
from pyhive import hive
from jinjasql import JinjaSql
j = JinjaSql()
template = "SELECT * FROM sample_07 WHERE code = {{ codex }}"
data = {'codex': '13-1061'}
query, bind_params = j.prepare_query(template, data)
updated_bind_params = list(bind_params)
cursor = hive.connect('sandbox.hortonworks.com').cursor()
cursor.execute(query, updated_bind_params)
print(cursor.fetchall())
它可以从配置单元中获取记录。
是否可以使用 jinjasql 和 pyhive 执行 hive 查询? 当我尝试它时,出现以下错误。
pyhive.exc.ProgrammingError: Unsupported param format:
odict_values(['XXXXXXX'])
我可以使用 jinjasql 和 pyhive 执行查询,但我需要同时使用两者来防止 sql 注入。
环境(都在同一个虚拟机上。)
- Hortonworks 沙盒上的 Hortonworks 数据平台 (HDP®) 2.6.4 VirtualBox
- Jinjasql 0.1.6
- PyHive 0.5.1
- Python 3.5.5
Pyhive 在参数中支持列表、元组和字典。虽然 jinjasql 支持多参数样式,并且如文档中所述 here
它应该 return 一个列表,除了 'named' 或 'pyformat' 会 return 一个字典。由于 Jinjasql 创建了一个 Ordereddict,它抛出了这个异常。解决方案应该是使用 return 列表的参数样式。
希望这对您有所帮助:)
更新 python 3: 在 python 3 中,您必须将参数转换为 dict.values() returns 字典值的 view 列表。
正如您提到的,PyHive 允许列表作为执行参数,我按照您的建议使用列表函数将 bind_params 转换为列表。
from pyhive import hive
from jinjasql import JinjaSql
j = JinjaSql()
template = "SELECT * FROM sample_07 WHERE code = {{ codex }}"
data = {'codex': '13-1061'}
query, bind_params = j.prepare_query(template, data)
updated_bind_params = list(bind_params)
cursor = hive.connect('sandbox.hortonworks.com').cursor()
cursor.execute(query, updated_bind_params)
print(cursor.fetchall())
它可以从配置单元中获取记录。