Я использую пакет impyla для запуска серии запросов с Hive on Spark от python с использованием поддержки SQLAlchemy пакета impyla.SQLAlchemy автоматически создает и закрывает курсор dbapi для каждого выполняемого оператора sql.Поскольку реализация impyla HiveServer2Cursor закрывает базовый сеанс Hive, каждый оператор sql заканчивается выполнением в качестве отдельного задания Spark.Я хотел бы избежать накладных расходов на запуск нового задания Spark для каждого оператора sql И использовать SQLAlchemy вместо интерфейса raw 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сеанс, когда соединение закрыто.