2012-05-11 1 views
2

テーブルのサブセットで実行したい変換スクリプト(Rで書かれています)があります。私。いくつかの列の値ごとに1つずつ、実行するステップを少なくしたいと思います。テーブルのサブセットにHive変換スクリプトを実行します。

元の表に列{C1、C2、C3}があると仮定すると、変換はC1の異なる値で実行され、C2とC3が入力データとして渡され、結果としてC1の値とともに出力されます。

これを解決するためにHive DISTRIBUTE操作を見ていますが、正しい構文/機構を理解することはできません。例えば

、これは私のテーブルである場合:

C1,C2 
a,1 
a,2 
b,1 
b,2 
b,3 

私のスクリプトは、テーブルの各サブセットのためのC2の平均値を返し、C1は、その結果は次のようになります。

C1,D1 
a,1.5 
b,2 

文法的に間違っている私がしたいと思うものの擬似コードです。 my_tableに列C1、C2があると仮定します。

from my_table 
select 
    C1, 
    transform(
    C2 
) 
using 'my_script.R' 
distribute by C1 
; 

答えて

1

スクリプトはマップコンポーネントのないreduceスクリプトです。アイデンティティマッパー(/ bin/cat)を使用して、入力をreduce部分にフィードする必要があります。マップとreduceの間にシャッフルフェーズがあり、これはあなたのDISTRIBUTE BY C1節の世話をします。ここで は、私が書いたことを迅速に何かあり、それを検証する機会を得ていない:

FROM (
    FROM my_table 
    MAP C1, C2 
    USING '/bin/cat' 
    AS C1, C2 
    DISTRIBUTE BY C1) map_output 
INSERT OVERWRITE TABLE mean_table 
    REDUCE map_output.C1, C2 
    USING 'my_script.R' 
AS C1, mean; 

は、それが(あなたのケースではC1、)キーの同じ値を持つすべてのレコードが保証だということを忘れてはいけません同じ減速機(すなわち、スクリプトの同じインスタンス化)に行きます。ただし、同じレデューサーに設定されている入力のキーの値が異なる別のレコードを持つこともできます。たとえば、あなたが のすべてを持つことができ

、1 、2 B、1件の B、2 B、3 は同じ減らすスクリプトにアクセスしてください。したがって、減速機のレコードの入力セットを壊さないようにする必要があります

+1

ありがとうございます。これは私のスクリプトがデータのサブセットでのみ実行されることを意味するものではないので、これが問題を解決するかどうかはわかりません。私はまだ 'a'行対 'b'行を明示的に処理する必要があります。私。私のスクリプトが単に実行中の平均を計算すると失敗します。 – yoni

関連する問題