2023-02-23
需要 self
Python是一個非常優秀的編程語言,使用的群體非常的多,第三方的庫也非常的多。其中有一個庫叫做:PyHive,作用就是:連接到Hive,使用Python語言來操作Hive的數據!
PyHive是通過HiveServer2服務連接到原數據庫的,因此需要啟動HiveServer2服務!
啟動HiveServer2服務
# 直接開啟HiveServer2的服務,但是需要注意這個進程是一個前臺進程
hive --service hiveserver2
# 啟動HiveServer2的服務,并將其設為后臺進程,但是依然會在控制臺輸出一些日志信息
hive --service hiveserver2 &
# 啟動HiveServer2的服務,并將其設為后臺進程,將日志輸出在指定的文件中
hive --service hiveserver2 > /tmp/my_hive_logs/hiveserver2.log 2>&1 &
需要注意:
HiveServer2服務的完全啟動需要一定的時間,追蹤日志文件會發現最后在啟動SESSION_ID,當啟動到4個SESSION_ID的時候,服務才算完全啟動,此時才可以使用beeline或者PyHive連接到Hive的元數據。這個過程需要1分鐘左右。
安裝依賴
我們需要使用Python代碼來操作Hive,就需要安裝好對應的庫文件。直接使用pip命令來安裝即可。那么安裝在什么位置呢?主機還是虛擬機呢?
在哪里執行代碼,就在哪里安裝!
●你的Python代碼需要在windows本地運行,那就需要在windows上安裝;
●你的Python代碼需要在macOS本地運行,那就需要在macOS上安裝;
●你的Python代碼需要在CentOS虛擬機中運行,那就需要在CentOS虛擬機上安裝
# 使用pip3安裝第三方庫文件
pip3 install pyhive sasl thrift thrift-sasl
注意事項:
在CentOS中,安裝sasl的時候可能會失敗,是因為缺少依賴文件,直接使用yum安裝即可。
yum install gcc gcc-c++ cyrus-sasl-devel
基本的訪問代碼
# @Author : 大數據章魚哥
# @Company : 北京千鋒互聯科技有限公司
# 導入第三方模塊
from pyhive import hive
# 創建程序與Hive的連接對象
hive_connection = hive.Connection(
host="192.168.10.101", # 開啟了HiveServer2服務的節點IP地址或者主機名
port=10000, # 連接到HiveServer2服務的端口,默認是10000端口
username="root", # 連接到HiveServer2服務的用戶名
database="mydb" # 連接到Hive的數據庫名字
)
# 創建游標對象
hive_cursor = hive_connection.cursor()
# 執行HQL語句
hive_cursor.execute("select * from emp")
# 獲取所有的執行結果
result = hive_cursor.fetchall()
for row in result:
print(row)
# 釋放資源
hive_cursor.close()
hive_connection.close()
使用PyHive操作Hive的過程,其實與Python操作MySQL數據庫非常的類似!
當然,在上述的代碼執行過程中,有可能會因為中間的代碼出現異常,導致最終的資源無法釋放的問題,因此我們可以這樣優化代碼
# @Author : 大數據章魚哥
# @Company : 北京千鋒互聯科技有限公司
# 導入第三方模塊
from pyhive import hive
# 創建程序與Hive的連接對象
hive_connection = hive.Connection(
host="192.168.10.101", # 開啟了HiveServer2服務的節點IP地址或者主機名(如果設置為主機名,需要保證已經做好映射)
port=10000, # 連接到HiveServer2服務的端口,默認是10000端口
username="root", # 連接到HiveServer2服務的用戶名
database="mydb" # 連接到Hive的數據庫名字
)
# 創建游標對象,同時使用with代碼段,完成資源的自動釋放
with hive_connection, hive_connection.cursor() as hive_cursor:
# 執行HQL語句
hive_cursor.execute("select * from mydb")
# 輸出查詢到的所有結果
rows = hive_cursor.fetchall()
for row in rows:
print(row)
功能封裝
我們可以封裝一個類,專門用來做與Hive的交互操作。我們在使用的時候,只需要將需要執行的HQL語句告訴這個類的對象即可。
# @Author : 大數據章魚哥
# @Company : 北京千鋒互聯科技有限公司
from pyhive import hive
class HiveClient:
__slots__ = ('db', 'cur')
def __init__(self, *, host='192.168.10.101', port=10000, username='root', database='mydb'):
"""
構造函數,提供默認的連接配置
:param host: 連接到的服務器地址,默認 192.168.10.101
:param port: 連接到的服務器端口,默認 10000
:param username: 連接到的服務器用戶,默認 root
:param database: 連接到的數據庫,默認 mydb
"""
self.db = hive.Connection(host=host, port=port, username=username, database=database)
self.cur = self.db.cursor()
def __del__(self):
"""
析構函數,用于釋放連接對象
:return:
"""
self.cur.close()
self.db.close()
def execute(self, sql, params=None):
"""
執行DDL、DML的操作
:param sql: 需要執行的SQL語句
:param params: 執行SQL語句時候的參數
:return:
"""
try:
self.cur.execute(sql, params)
self.db.commit()
print("execute: ", sql, params)
except Exception as e:
print(e)
self.db.rollback()
def query_all(self, sql):
"""
執行指定的查詢語句,并返回所有的查詢結果
:param sql: 需要執行的查詢操作
:return: 查詢到的所有結果
"""
self.cur.execute(sql)
return self.cur.fetchall()
封裝完成之后,后面再使用到Python來操作Hive的時候將會非常的方便
# 實例化連接到操作Hive的對象
client = HiveClient()
# 加載數據,如果要使用local的路徑,需要注意的是這里指的是連接到的hiveserver2所在節點的文件系統
# client.execute("load data local inpath '/root/example_01_data' into table example_01")
# 克隆表
# client.execute("create table example_01_copy as select * from example_01")
# 刪除表
# client.execute("drop table example_01_copy")
# print(client.query_all("select * from example_01"))
開班時間:2021-04-12(深圳)
開班盛況開班時間:2021-05-17(北京)
開班盛況開班時間:2021-03-22(杭州)
開班盛況開班時間:2021-04-26(北京)
開班盛況開班時間:2021-05-10(北京)
開班盛況開班時間:2021-02-22(北京)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2020-09-21(上海)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2019-07-22(北京)
開班盛況Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號