2016-04-13 5 views
0

Hadoopテーブル(mytable1)からデータを変換し、変換の出力を別のものに書き込むには、PythonスクリプトをHiveクエリ内で使用する必要がありますテーブル(mytable2)、私は必要なデータは複雑なJSONのためです。変換はmytable1から1行、mytable2で360行書く必要があります。私は、クエリ内のPythonスクリプトを呼び出すことができますハイブのTRANSFORMコマンドを使用することをお勧めして行うためにHiveのTRANSFORMコマンドを使用してHadoopテーブルにpythonスクリプトの出力を書き込む

(スクリプトは以下の通りです)。

私の問題は、全体の事の実行中、何も私の出力テーブルに書き込まれていないということです。

私はこのワークフローが動作する方法があることを理解:最初のサブクエリの出力は、標準入力からPythonスクリプトによって読み取られます。変換された出力はstdout(タブで区切られた形式)で書かれ、そこでHiveによって読み込まれます。だから私は独立していくつかの要素をテストしました:

  • サブクエリmytable1を読むことはうまくいきます。
  • また、私はそれをサブクエリの出力を供給し、Pythonスクリプトをテストしてみた、そしてそれは私が期待されるタブ区切り形式で必要な結果を提供します。
  • 私はテーブルに出力を書き込まずにクエリを実行しようとしましたが、ここでは出力が得られないので、問題はおそらくテーブルの作成に関係しません。

私の推測では、pythonスクリプトの出力はHiveによって読み取られません。しかし、なぜ私は同じような場合に私の同僚のために働くことが証明されているハイブとPythonの構文を使用したので、私は理解していません。そのように見えるの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); 

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

あなたのSELECT声明の中で、あなたの.pyファイルの前でpythonを逃している

マイハイブクエリは次のようになります。

試してみてください。代わりに

USING 'python parsing_json.py' 

。あなたの.pyで

追加シェバングも動作します。

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); 
関連する問題