场景:
python 操作hive 数据库,总是连接失败
经过多次努力,封装了类,方便大家使用
代码描述:
首先hive 里面,认证KERBEROS
from pyhive import hive
simplefilter(action='ignore', category=FutureWarning)
class HiveFetcher:
"""构造连接hive并提取数据的类:
host = 对应服务器的IP号;
port = 对应服务器的端口号
user,pwd,db根据实际需求设置db使用数据库
"""
def __init__(self, host='slave65', port=10000, user=None, auth="KERBEROS", kerberos_service_name="hive",
pwd=None, db='xxxxxx'):
self.host = host
self.port = port
self.user = user
self.pwd = pwd
self.auth = auth
self.kerberos_service_name = kerberos_service_name
self.db = db
self.conn = None
self.cur = None
# 连接数据库
def connectDatabase(self):
try:
self.conn = hive.connect(host=self.host, port=self.port, username=self.user,
password=self.pwd, database=self.db, auth=self.auth,
kerberos_service_name=self.kerberos_service_name)
except:
print("connect hive Database failed")
return False
self.cur = self.conn.cursor()
return True
# 关闭数据库
def close(self):
# 如果数据打开,则关闭;否则没有操作
if self.conn and self.cur:
self.cur.close()
self.conn.close()
return True
# 执行数据库的sq语句,主要用来做插入操作
def execute(self, sql, params=None):
# 连接数据库
self.connectDatabase()
try:
if self.conn and self.cur:
# 正常逻辑,执行sql,提交操作
self.cur.execute(sql, params)
self.conn.commit()
except:
print("execute failed: " + sql)
self.close()
return False
return True
# 用来查询表数据
def fetchall(self, sql, params=None):
self.execute(sql, params)
return self.cur.fetchall()
def orgindata_fetch(connect_type):
sql_search = ' 需要执行的 SQL'
# 从数据库中查询相关数据
print(sql_search)
try:
search_data = connect_type.fetchall(sql=sql_search)
except Exception as e:
logging.error('连接hive数据库,执行提取原始数据操作出现故障:{}'.format(e), exc_info=True)
search_data = pd.DataFrame(list(search_data))
return search_data
print('开始读取数据...')
# --------------------训练自身数据时,只需修改如下两行文件的定位--------------------#
hive_conns = HiveFetcher()
ori_data = orgindata_fetch(hive_conns)