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中增加下面屬性:
<property>
<name>hive.server2.authentication</name>
<value>NOSASL</value>
</property>
當然,小編使用的是CDH搭建的集羣,直接在監控界面配置即可,如下所示: