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