1. 程式人生 > >hive中執行python指令碼

hive中執行python指令碼

hive中可以載入python指令碼,然後在hive中執行。

好處:可以解決模型離線上線問題和一些基於行的運算。

python指令碼

import sys

#本程式碼實現47中變換中的求均值
#執行前先處理掉空值
'''
表結構:
uid,c1,c2,c3
123,11,22,33
...
...

'''
if __name__ == '__main__':

    for line in sys.stdin: #hive一行一行讀取,必須使用標準輸入流輸入
        features = line.strip().split('\t')  # 在hive表中欄位間的分割符是\t
        if len(features) != 7:   #判斷每行的長度是否正確,理論上這句if不要也沒問題
            print(sys.stderr, "error:error1!")
            break
        avg = (int(features[1])+int(features[1])+int(features[1])) / 3 # hive傳入的資料全部為string型別,所以要先轉成int後計算
        print(str(features[0])+'\t'+str(avg))  # 輸出到hive表中,輸出的格式必須為string型別,'\t'為分隔符

 

hive中程式碼:

add ARCHIVE hdfs:///tmp/anaconda3_nlp.zip;   -- 指定python及相關包的路徑,該路徑為叢集hdfs上的路徑
add file hdfs:///tmp/02_LSTM/tmp.py;    -- 將上面的python指令碼上傳到hdfs上(比如你自己的檔案下)

drop table if exists manyorder_model_lstm_columntorow;
create table manyorder_model_lstm_columntorow as
select
transform(
            uid
              ,c1
              ,c2
              ,c3
  )
using 'anaconda3_nlp.zip/anaconda3/bin/python  tmp.py'  -- 指定python的路徑
as (uid,avg)

from  tableX
;