1樓:舟遏怒江
最近正好解決了這個問題,先佔坑,我週末來寫詳細的答案
下面是答案正文:
我們是基於pyhive這個包來連線python和hive。網上關於pyhive這個包的使用經驗比較少,然後這個包也沒有相關文件,所以當時我們就主要是基於原始碼和測試,打通了python和hive的連線:
首先是pyhive的安裝:pyhive這個包依賴於sasl,thrift,thrift-sasl這三個包,因此請參照下面的順序安裝,pip不行的時候,可以換用conda安裝
pip install sasl
pip install thrift
pip install thrift-sasl
pip install PyHive
然後是網上的例子一般都是下面類似的demo:
import
sysfrom
pyhive
import
hive
defdhive
():try
:conn
=hive
.connect
(host
="server_ip"
,port
=10000
,auth
="..."
,database
="..."
,username
="..."
,password
="..."
)cursor
=conn
.cursor
()cursor
.execute
("select * from table_name"
)res
=cursor
.fetchall
()conn
.close
()for
item
inres
(item
)except
Exception
:print()
if__name__
=="__main__"
:dhive
()這個demo比較簡單,但是體現了python連線hive的一般流程:建立連線,獲取游標,執行sql語句,獲取結果,關閉連線。
但是在專案中,對hive常常有很多必要的設定,這在上面的demo中沒法展示出來,通過檢視原始碼, 我們再Connection這個類的建構函式中找到了configuration引數:paramconfiguration: A dictionary of Hive settings (functionally same as the `set` command),由此可知這個引數就是配置hive。
class Connection(object):
def __init__(self, host=None, port=None, username=None, database='default', auth=Noneconfiguration=None, kerberos_service_name=None, password=None, thrift_transport=None):
因此,我們可以用如下的方式配置hive:
hive_config39;mapreduce.job.queuename': 'my_hive',
'hive.exec.compress.output': 'false',
'hive.exec.compress.intermediate': 'true',
'mapred.min.split.size.per.node': '1',
'mapred.min.split.size.per.rack': '1',
'hive.map.aggr': 'true',
'hive.groupby.skewindata': 'true'
}conn = hive.connect(host="server_ip",port=10000, auth="...", database="...
",username="..."password="...", configuration=hive_config)
然後是上面的游標執行之後,通過fetchall()取出的結果是表中單純的資料,但是呢我們常常還需要知道表頭資訊。表頭這個東西在哪兒呢,還是通過檢視原始碼:在Cursor類中有乙個description()方法,通過@property裝飾器被裝飾成乙個屬性,在這個方法下面就記錄了資料表中每一列對應的列名,資料型別等資訊。
@property
def description(self34;""This read-only attribute is a sequence of 7-item sequencesEach of these sequences contains information describing one result columnnametype_codedisplay_size (None in current implementationinternal_size (None in current implementationprecision (None in current implementationscale (None in current implementationnull_ok (always True in current implementationThis attribute will be ``None`` for operations that do not return rows or if the cursor has
not had an operation invoked via the :py:meth:
`execute` method yetThe ``type_code`` can be interpreted by comparing it to the Type Objects specified in the
section below34;""
因此可以通過下面的方式獲取列名:
columns = cursor.description
上面就是我們經常需要用到的關於pyhive的一些特性,至於帶引數的sql語句啊,通過fomat(**args_dict)的方式傳遞就好了,這裡就不再贅述了。
希望基於上面的敘述,可以對python連線hive的相關問題都有所啟發,其實多嘗試就好了。
python3 6在有pip的條件下如何安裝TensorFlow?
還沒想好 偶遇大神,親測有效!附上鏈結最新Win7 Python3.6.0 Anaconda3 4.3.21 Tensorflow的安裝與配置 不用切換python3.5 倪古拉斯 按照Tensorflow官網指導已經支援Python3.6,但我本地還是失敗了MMP。按照官網只要執行如下命令即可 T...
python3 6版本的如何安裝好scipy以及numpy mkl函式庫
你的問題描述的不夠清晰 python3.6 和 python3.8 是你單獨安裝的,還是通過 anaconda 新建子環境安裝的?python3.6 和 python3.8 均在 anaconda 裡面 直接使用 conda 作為包管理工具安裝 scipy,首先 conda activate 切換環...
如何評價 360 的連按兩次 ctrl 開啟 360 搜尋的功能?
於是就 根本就沒管好不好用 別人不知道我公司的電腦有天莫名其妙出來這個東西我也不知道什麼時候有裝過 難道覺得一樣東西好吃就可以直接往人家嘴巴裡塞?你試試看精神病院捉不捉你 遊小夕 感謝題主告訴我動不動冒出來的360搜尋欄是怎麼回事。我對我沒有安裝過但是360自行安裝的行為非常不滿。發現莫名其妙彈出搜...