2016-04-13 29 views
0

我需要在Hive查詢中使用python腳本來轉換Hadoop表(mytable1)中的數據並將轉換的輸出寫入另一個表table(mytable2),因爲我需要的數據是複雜的JSON。該轉換應該從mytable1中取1行,並在mytable2中寫入360行。使用Hive的TRANSFORM命令在Hadoop表中編寫python腳本的輸出

爲了做到這一點,我建議使用Hive的TRANSFORM命令,它允許在查詢中調用python腳本(腳本如下)。

我的問題是,雖然整個事情運行,沒有什麼是寫在我的輸出表。

我明白這個工作流的工作方式是:第一個子查詢的輸出由stdin的python腳本讀取。然後,轉換的輸出被寫入stdout(以製表符分隔的格式),然後由Hive讀回。所以我已經測試了一些獨立的元素:

  • 閱讀mytable1的子查詢效果很好。
  • 我也測試了python腳本,爲它提供了子查詢的輸出,並且它以預期的製表符分隔的格式給出了我想要的結果。
  • 我試圖執行查詢而沒有將輸出寫入表中,並且在這裏我沒有得到任何輸出,所以問題可能與表創建無關。

所以我的猜測是python腳本的輸出沒有被Hive讀取。但我不明白爲什麼,因爲我已經使用了Hive和Python語法,已經證明可以爲我的一個同事在類似情況下工作。

我的蜂巢查詢看起來是這樣的:

ADD FILE parsing_json.py; 

DROP TABLE IF EXISTS mytable2; 
CREATE TABLE mytable2 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\011' 
AS 

SELECT TRANSFORM (output_col1, 
        output_col2, 
        output_col3) 
        USING 'parsing_json.py' 
AS (input_col1, 
    input_col2) 
FROM (SELECT input_col1, input_col2 FROM mytable1); 

有了一個python腳本看起來就像是:

import sys 
import pandas 


def main(): 

    for line in sys.stdin: 
     var1, var2, var3 = line.split('\t') 

     # my output Dataframe has 2 columns 
     output = sometransformation(var1, var2, var3) 
     print output.to_csv(sep='\t', index=False, header=False), 


if __name__ == "__main__": 
    main() 

回答

-1

你錯過了在.py文件的前pythonSELECT聲明。

嘗試:

USING 'python parsing_json.py' 

代替。

在你的.py中添加shebang也可以。

0

不確定你使用的是哪個版本的python。 但是,您可以使用OS庫從CSV文件寫入Hive。以下是密碼

import os; 

output.to_csv('/home/output.csv',sep='\t', index=False, encoding='utf-8') 

load_statement = "hive -e \"LOAD DATA LOCAL INPATH '/home/output.csv' OVERWRITE INTO TABLE mytable2\"" 

os.system(load_statement);