我需要在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()