Python在HiveQL中的運用
- 2020 年 1 月 13 日
- 筆記
在寫HiveQL的時候,往往發現內置函數不夠用,Hive支持用戶自定義函數UDF,使用Java進行開發。很多時候這顯得過於繁重。因而Hive中提供了Transform機制(基於hadoop streaming),這種機制相當於提供了一個腳本程序的入口,因此我們可以很方便的使用shell、perl、python等語言進行開發。
Python是很簡單易學開發效率也很高的一種腳本語言, 雖然性能上不及Java和Cxx, 但是在大多數情況下, 特別是hadoop這樣的分佈式環境中,不會成為特別明顯的性能瓶頸。
hive中transform的標準語法是下面這樣的:
select transform(x, y, z....) using 'xxx.py' as (xx, yy, zz....) from ....
其中,xyz為待處理的字段,xxx.py即為我們的python腳本。
在執行上面這個hiveql語句之前,需要將相應的腳本文件添加到環境中。
使用add file xxx.py即可,這裡的文件名不能加引號。
python腳本可以採用下面這個框架:
def main(): try: for line in sys.stdin: n = line.strip() #your code here... print n except: return None if __name__ == "__main__": main()
hive會將每一行數據輸出到python程序的標準輸入中,處理完畢後,python將結果直接打印到標準輸出,整個流程就完畢了。
寫完腳本後一定要注意測試,直接在命令行下手動輸入數據,看看程序處理是否正常。
這一點很重要,如果python程序本身有bug,則在hive語句執行的時候,會拋出broken piple之類異常,這類問題非常隱蔽,需額外注意。而且python文件本身一定要加可執行權限chmod +x abc.py
另外,select中的所有字段,最好全部包含在transform中,否則可能會出現莫名其妙的錯誤。