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中,否則可能會出現莫名其妙的錯誤。