1. 前言
目前python3連接hive的方法主要是使用cloudera開發的impyla包,但是要安裝impyla也不是那麼容易的事情,因爲impyla要使用系統底層模塊,所以就要先安裝對應的模塊,而不僅僅是安裝impyla就可以了。如果是想hdfs-server就好了,一個http就能搞定。
在過大網友的無私奉獻,以及Google和Baidu的幫助下,終於解決了python3連接hive的問題。
需要注意的是,centos和Ubuntu的系統底層模塊安裝和更新是不一樣的,這個需要注意。
後來cloudera開發了一個新的python包叫ibis,也是用來操作hive數據的,看其博客說得神乎其神,似乎是impyla的改進升級版,將來要用ibis替換掉impyla,也使用了一下,還是可以的。
下面先說impyla的安裝和使用,再說ibis的使用。
2. centos安裝
先安裝和更新cyrus,sasl,和gcc。這些方法在centos容器中也是一樣可行的。
sudo yum install cyrus-sasl-devel
sudo yum install gcc-c++
安裝python模塊,注意,thrift-sasl版本和hive版本要對應,如果不知道多試幾次就好了。
pip install thrift-sasl==0.2.1
pip install sasl
pip install impyla
3. Ubuntu安裝
我的Ubuntu使用的是win10的linux子系統,用起來挺方便的,不用裝虛擬機,啓動快,就像容器一樣。
下載過程中,如果網速慢,可以切換國內鏡像。
sudo apt-get install libsasl2-dev
sudo apt-get install python3-dev
sudo apt-get -y install build-essential
安裝python模塊,同centos。
pip install thrift-sasl==0.2.1
pip install sasl
pip install impyla
4. 測試impyla
測試連接hive:
from impala.dbapi import connect
# 需要注意的是這裏的auth_mechanism必須有,但database不必須
conn = connect(host='xxx.xxx.xxx.xxx', port=10000, database='default', auth_mechanism='PLAIN')
cur = conn.cursor()
cur.execute('SHOW DATABASES')
print(cur.fetchall())
cur.execute('SHOW Tables')
print(cur.fetchall())
cur.close()
conn.close()
5. ibis安裝
如果裝好了impyla,那麼ibis就很好安裝了,就是簡單的pip命令就可以,其中ibis會引用impyla。
pip install hdfs
pip install ibis-framework
6. ibis使用
下面是簡單的使用案例,基本覆蓋常用的方法。
# 1.查詢hdfs數據
hdfs = ibis.hdfs_connect(host='xxx.xxx.xxx.xxx', port=50070)
hdfs.ls('/')
hdfs.ls('/apps/hive/warehouse/ai.db/tmp_ys_sku_season_tag')
hdfs.get('/apps/hive/warehouse/ai.db/tmp_ys_sku_season_tag/000000_0', 'parquet_dir')
# 2.查詢數據到python dataframe
from ibis.impala.api import connect
conn= connect('xxx.xxx.xxx.xxx', 10000, auth_mechanism='PLAIN',database='ai')
conn.exists_table('helloworld')
# 執行SQL
sql='set mapreduce.job.queuename=ai'
conn.raw_sql(sql)
# 將SQL結果導出到python dataframe
requete = conn.sql('select * from ai.da_aipurchase_dailysale_for_ema_predict')
df = requete.execute(limit=None)