# -*- coding:utf-8 -*-
from datetime import datetime, date, timedelta
import time
from impala.dbapi import connect
from krbcontext import krbcontext
log = lambda X: print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}:{X}")
class ConnectUtils(object):
def __init__(self, connect_type="impala"):
'''
:param connect_type: 默认impala,可以选择 impala 或者 hive
'''
self.conn = None
self.cur = None
self.connect_type = connect_type
self.__connect()
def __connect(self, connect_host='cdh2.slave1.com'):
'''
连接大数据平台
'''
retry_nums = 10
port = 21051 if self.connect_type == "impala" else 10000
while retry_nums:
try:
with krbcontext(using_keytab=True,
principal='***/****',
keytab_file='keytab_file_path'):
conn = connect(host=connect_host, port=port, auth_mechanism='GSSAPI', database='spiderdb',
kerberos_service_name=self.connect_type)
self.conn = conn
self.cur = self.conn.cursor()
return
except Exception as e:
log(f'error msg: {e}')
time.sleep(0.5)
retry_nums -= 1
exit()
def implement_sql(self, sql):
'''
执行语句,例如:插入语句、更新语句、同步语句
'''
try:
self.cur.execute(sql)
self.conn.commit()
log(f"语句执行成功:{sql}")
except Exception as e:
log(f"sql语句执行失败,msg:{e}")
def select(self, sql, ls=None):
'''
查询语句
'''
try:
if ls:
self.cur.executemany(sql, ls)
else:
self.cur.execute(sql)
data = self.cur.fetchall()
return data
except Exception as e:
log(f"数据查询失败,msg:{e}")
def insert(self, table_name: str, keys: list, data_ls: list, partition=None):
'''
数据量较多时使用
:param table_name: 表名
:param keys: 插入字段
:param data_ls: 数据列表
:param partition: 分区字典
'''
cph_ls = "{}" + ','.join(['{}' for i in range(len(keys))]) # 拼接占位符字符串
# 判断是否加入分区条件
if partition:
partition = ','.join([f"{key}='{value}'" for key, value in partition.items()])
sql = f"INSERT into {table_name}({','.join(keys)}) PARTITION({partition}) values({cph_ls})"
else:
sql = f"INSERT into {table_name}({','.join(keys)}) values({cph_ls})"
try:
self.cur.executemany(sql, data_ls)
log(f"数据插入成功,数据量:{len(data_ls)}")
except Exception as e:
log(f"数据插入失败,msg:{e}")
def close(self):
self.cur.close()
self.conn.close()
self.conn, self.cur = None, None
def __del__(self):
if self.conn:
print("关闭连接")
self.close()
python链接imala工具
最新推荐文章于 2024-07-13 21:34:41 发布