我正在使用impyla包使用 impyla 包的 SQLAlchemy 支持从 python 运行一系列使用 Hive on Spark 的查询。SQLAlchemy 自动为每个执行的 sql 语句创建和关闭一个 dbapi 游标。因为 impyla HiveServer2Cursor实现关闭了底层 Hive 会话,所以每个 sql 语句最终都作为一个单独的 Spark 作业运行。我想避免为每个 sql 语句启动一个新的 Spark 作业并使用 SQLAlchemy 而不是原始 dbapi 接口的开销。
重用 dbapi 游标确实有效,但我还是更喜欢使用 SQLAlchemy 引擎及其连接池和自动游标管理功能。
# this version uses raw dbapi and only one cursor and therfore one hive session
con = connect(host='cdh-dn8.ec2.internal', port=10000, kerberos_service_name='hive', auth_mechanism='GSSAPI')
cur = con.cursor()
cur.execute('set hive.execution.engine=spark')
cur.execute("select * from reference.zipcode where zip = '55112'")
rows = cur.fetchall()
# use data from result and execute more queries ...
cur.close()
con.close()
# this version uses sqlalchemy and one cursor per statement executed, resulting in multiple hive sessions
sqlalchemyengine = create_engine('impala://cdh-dn8.ec2.internal:10000', kerberos_service_name='hive', auth_mechanism='GSSAPI')
conn = sqlalchemyengine.connect()
conn.execute('set hive.execution.engine=spark')
result = conn.execute("select * from reference.zipcode where zip = '55112'")
# use data from result and execute more queries ...
我想知道 impyla 是否有充分的理由使用每个游标打开和关闭 Hive 会话,而不是在连接关闭时关闭 Hive 会话。