我想使用sqlalchemy和odbc.ini文件连接到Hive
我有一个odbc.ini文件,看起来
[Hive]
Description = ODBC Hive connection to Hadoop cluster
Driver = /opt/cloudera/hiveodbc/lib/64/libclouderahiveodbc64.so
HOST = host1,host2,host3
Schema = default
ServiceDiscoveryMode = 1
ZKNamespace = hiveserver2
HiveServerType = 2
AuthMech = 1
ThriftTransport = 1
UseNativeQuery = 0
KrbHostFQDN = _HOST
KrbServiceName = hive
ServicePrincipalCanonicalization = 1
SSL = 0
TwoWaySSL = 0
我试着和
import sqlalchemy
import pandas as pd
query_test = """SELECT * FROM my_table limit 1;"""
engine = sqlalchemy.create_engine("hive://@Hive")
conn = engine.connect()
print(pd.read_sql(query_test, conn))
它生成错误TTransportException:未能解析Hive:10000的套接字。
在……里面
~/folder/lib64/python3.6/site-packages/thrift/transport/TSocket.py in open(self)
125 msg = 'failed to resolve sockaddr for ' + str(self._address)
126 logger.exception(msg)
--> 127 raise TTransportException(type=TTransportException.NOT_OPEN, message=msg, inner=gai)
128 for family, socktype, _, _, sockaddr in addrs:
129 handle = self._do_open(family, socktype)
有人告诉我,这是因为我们有多个宿主,必须经过一个叫做动物园管理员的地方
我无法理解的是,当我使用pyodbc时,没有问题。下面的工作很好
pyodbc.autocommit = True
cnxn = pyodbc.connect(dsn='Hive', autocommit=True)
data = pd.read_sql(query, cnxn, params=params)
cnxn.close()
我应该如何配置sqlalchemy代码来处理我的odbc.ini文件?
我有过
PyHive-0.6.5
thrift-0.16.0
thrift_sasl-0.4.3
SQLAlchemy-1.4.36
sasl-0.3.1
pyodbc-4.0.32
发布于 2022-06-03 14:50:59
您似乎希望使用Cloudera中的Hive连接器连接到Hive,但随后使用了一个hive://
URI,这意味着SQLAlchemy将尝试使用pyHive,因为它不知道odbc.ini
。
要从SQLAlchemy通过ODBC连接,您需要使用<dialect>+pyodbc://
URI,例如mssql+pyodbc://
、mysql+pyodbc://
或sybase+pyodbc://
。
Hive + ODBC没有等效的方言,所以即使您通过pyODBC在SQLAlchemy中管理Hive连接,它也不知道如何与Hive对话。我找到了这个回购AurelienGalicher/PyHiveODBC,它似乎包含一个Hive + ODBC方言的初稿,但是我还没有测试它。
pyHive文档通过连接SQLAlchemy URI直接指向hive://
。
因此,要么您需要开发一个Hive + ODBC方言,要么使用pyHive,它根本不使用odbc.ini (因此不使用odbc.ini DSN)。
https://stackoverflow.com/questions/72381308
复制相似问题