OK,本文来看看本地在PyCharm中使用pyhive连接hive数据库时踩过的坑吧,先看看一眼小编的测试代码~
首先是封装了一个连接hive获取数据的类,因为是测试,所以写的简单了些,如下:
'''
@File : sql.py
@Author: xzw
@Date : 2020/6/14
@Desc : 封装类
'''
from pyhive import hive
import pandas as pd
class TestHive(object):
'''
连接Hive获取数据
'''
def __init__(self, host, port, username, database):
'''
初始化方法
:param host: 地址
:param port: 端口号
:param username: 用户名
:param database: 数据库名称
'''
self.conn = hive.Connection(host=host, port=port, username=username, database=database)
def get_data(self, sql):
'''
获取数据
:param sql: SQL语句
:return: 返回得到的数据
'''
data = pd.read_sql(sql, self.conn)
return data
然后是测试类:
'''
@File : manager.py
@Author: xzw
@Date : 2020/6/14
@Desc : 访问Hive获取数据
'''
from connect_hive.sql import TestHive
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/get_hive_data")
def get_data():
'''
获取hive中的数据
:return:
'''
host, port, username, database = 'cdh-master', 10000, 'hive', 'test'
instance = TestHive(host, port, username, database)
result = instance.get_data("select * from xzw")
return {"result": result}
if __name__ == '__main__':
uvicorn.run(app="manager:app", host="127.0.0.1", port=9999, reload=True, debug=True)
上面就是整个过程的简单代码,想象着很快就能拿到hive中的数据了,然后……坑来了~
第一个坑:
thrift.transport.TTransport.TTransportException: Could not start SASL: b'Error in sasl_client_start (-4) SASL(-4): no mechanism available: Unable to find a callback: 2'
解决办法是在Connection中添加auth="NOSASL":
self.conn = hive.Connection(host=host, port=port, username=username, database=database, auth="NOSASL")
第二个坑:
Connection Issue: thrift.transport.TTransport.TTransportException: TSocket read 0 bytes
解决办法是在hive-site.xml中增加下面属性:
hive.server2.authentication
NOSASL
当然,小编使用的是CDH搭建的集群,直接在监控界面配置即可,如下所示: