2

テーブルのサブセットで実行したい変換スクリプト (R で記述) があります。つまり、いくつかの列の値ごとに 1 つずつ、多くの削減ステップを実行したいと考えています。

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

これを解決するために Hive DISTRIBUTE 操作を調べていますが、その正しい構文/メカニズムがわかりません。

たとえば、これが私のテーブルの場合:

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

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

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
;
4

1 に答える 1

1

あなたのスクリプトはマップ コンポーネントのない reduce スクリプトです。ID マッパー (/bin/cat) を使用してから、reduce 部分に入力をフィードする必要があります。DISTRIBUTE BY C1map と reduce の間には、節を処理するシャッフル フェーズがあります。ここに私が書いた簡単なものがありますが、それを確認する機会がありませんでした:

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) を持つすべてのレコードが同じレデューサー (つまり、スクリプトの同じインスタンス化) に送られることが保証されていることを忘れないでください。ただし、同じレデューサーに設定された入力内の key の異なる値を持つ他のレコードを持つこともできます。

たとえば、a,1 a,2 b,1 b,2 b,3 のすべてを同じ reduce スクリプトに移動させることができます。そのため、レデューサーで入力レコード セットを確実に分割する必要があります。

于 2012-05-11T18:44:00.817 に答える