Импала связь через sqlalchemy
Я новичок в Hadoop и Impala. Мне удалось подключиться к Impala, установив Impyla и выполнив следующий код. Это соединение по LDAP:
from impala.dbapi import connect
from impala.util import as_pandas
conn = connect(host="server.lrd.com",port=21050, database='tcad',auth_mechanism='PLAIN', user="alexcj", use_ssl=True,timeout=20, password="secret1pass")
Затем я могу захватить курсор и выполнить запросы как:
cursor = conn.cursor()
cursor.execute('SELECT * FROM tab_2014_m LIMIT 10')
df = as_pandas(cursor)
Я хотел бы иметь возможность использовать sqlalchemy для подключения к Impala и иметь возможность использовать некоторые хорошие функции sqlalchemy. Я нашел тестовый файл в исходном коде imyla, который иллюстрирует, как создать движок sqlalchemy с драйвером impala, например:
engine = create_engine('impala://localhost')
Я хотел бы иметь возможность сделать это, но я не могу, потому что мой вызов вышеупомянутой функции подключения имеет гораздо больше параметров; и я не знаю, как передать их в sqlalchemy create_engine, чтобы получить успешное соединение. Кто-нибудь делал это? Благодарю.
3 ответа
Как объяснено на https://github.com/cloudera/impyla/issues/214
import sqlalchemy
def conn():
return connect(host='some_host',
port=21050,
database='default',
timeout=20,
use_ssl=True,
ca_cert='some_pem',
user=user, password=pwd,
auth_mechanism='PLAIN')
engine = sqlalchemy.create_engine('impala://', creator=conn)
Если ваша Impala защищена Kerberos, нижеприведенный сценарий работает (по какой-то причине мне нужно использовать hive:// вместо impala://)
import sqlalchemy
from sqlalchemy.engine import create_engine
connect_args={'auth': 'KERBEROS', 'kerberos_service_name': 'impala'}
engine = create_engine('hive://impalad-host:21050', connect_args=connect_args)
conn = engine.connect()
ResultProxy = conn.execute("SELECT * FROM db1.table1 LIMIT 5")
print(ResultProxy.fetchall())
import time
from sqlalchemy import create_engine, MetaData, Table, select, and_
ENGINE = create_engine(
'impala://{host}:{port}/{database}'.format(
host=host, # your host
port=port,
database=database,
)
)
METADATA = MetaData(ENGINE)
TABLES = {
'table': Table('table_name', METADATA, autoload=True),
}