使用 Hive 作为离线计算引擎(CDP,CDH,TDH,EMR 等)构建数据平台时,纯 SQL 缺少过程语言的能力,比如,if-else 条件控制,循环控制,设置程序内变量等。一般用户会借助其他语言来实现过程化编程,如 Python,其中 pyhive 是使用非常广泛的 module。
本地使用 pyhive
以下是用户在本地使用 pyhive 连接 hive 处理数据的示例
Hive使用账号密码认证:
# 加载包 from pyhive import hive # 建立连接 conn = hive.connect(host = '100.100.100.100', # HiveServer 地址 port = 10000, # 端口 username = 'xxx', # 账号 database = 'xxx' # 数据库 password = 'xxx') # 密码 # 查询 cursor = conn.cursor() cursor.execute('select * from table limit 10') # 业务处理语句 for result in cursor.fetchall(): print(result) # 关闭连接 cursor.close() conn.close()
Hive使用Kerberos认证
# 外层会话先执行 kinit -kt {keytab} {principal@REALM} 通过kerberos认证 # 加载包 from pyhive import hive # 建立连接 conn = hive.connect(host = '100.100.100.100', # HiveServer port = 10000, # 端口 auth = 'KERBEROS', kerberos_service_name = 'hive', database = 'xxx') # 查询 cursor = conn.cursor() cursor.execute('select * from table limit 10') # 业务处理语句 for result in cursor.fetchall(): print(result) # 关闭连接 cursor.close() conn.close()
Dataphin 内使用 pyhive
在 Dataphin 内,也支持按照以上本地的方式使用 pyhive,但这种方式存在以下问题:
- 如果 Hive 使用账号密码认证,就需要开发者可以获取到账号密码,第一容易造成账号泄密,第二如果修改账号密码,需要同步更新程序或变量。
- 如果 Hive 使用 Kerberos 认证,除了开发者需要获取 keytab 容易造成泄密和修改的问题外,Kerberos 认证流程的代码实现也比较复杂
- Dataphin 无法对用户做鉴权,可以绕开 Dataphin 的权限体系
- 无法查询使用逻辑表
Dataphin 在 v3.10 版本内置了 pyhive,调用内部 pyhive 时,系统将自动使用项目计算源中的认证配置来初始化 Hive 连接,提供一个 pyhive.hive.Cursor 对象 (hivec)。上文中的示例使用内置 pyhive 改写后如下:
# hivec 是 pyhive.hive.Cursor 对象 from dataphin import hivec # 查询 hivec.execute('select * from table limit 10') for result in hivec.fetchall(): print(result) # 系统自动 close connection,无须显式调用 close()
可以使用以下代码查看 hivec 的方法
from dataphin import hivec print(dir(hivec))
hivec 主要有以下方法,与 pyhive.hive.Cursor 的同名方法一致:
- execute,执行 SQL 语句
- fetchall,获取所有查询结果
- fetchmany,获取指定行数的查询结果
- fetchone,获取一行查询结果
- close,关闭 cursor 和 connection
以上就是 Dataphin 内置 pyhive 的全部内容。