0

Pig のテーブルの上位 x% 行を選択する必要があります。UDF を書かずにそれを行う方法を教えてもらえますか?

ありがとう!

4

3 に答える 3

3

前述のように、まずテーブル内の行数をカウントする必要があり、それから明らかに次のことができます。

A = load 'X' as (row);
B = group A all;
C = foreach B generate COUNT(A) as count;
D = LIMIT A C.count/10; --you might need a cast to integer here

問題は、関数の動的引数サポートLIMITが Pig 0.10 で導入されたことです。以前のバージョンを使用している場合は、関数を使用してここに提案がTOP表示されます。

于 2012-10-03T07:45:49.710 に答える
0

パーセンテージを取得する方法はわかりませんが、テーブルのサイズが 100 行であることがわかっている場合は、LIMIT コマンドを使用して上位 10% を取得できます。たとえば、次のようになります。

A = load 'myfile' as (t, u, v);
B = order A by t;
C = limit B 10;

(上記の例はhttp://pig.apache.org/docs/r0.7.0/cookbook.html#Use+the+LIMIT+Operatorから適応)

動的に 10% に制限することについては、テーブルの「大きさ」を知らずにこれを実行できるかどうかわかりません。また、UDF でこれを実行できないことは確かです。ジョブを実行してカウントする必要があります。行数、次に LIMIT クエリを実行する別のジョブ。

于 2012-10-02T23:58:13.233 に答える
0

豚のコードは書いてテストするのに時間がかかるので書きませんが、次のようにします (正確な解決策が必要な場合、そうでない場合は、より簡単な方法があります)。

  1. 入力からサンプルを取得します。数千のデータポイントかそこらと言います。
  2. これを並べ替えて n 個の分位数を見つけます。ここで n は、使用しているレデューサーの数と同じか、それより少し大きくなります。
  3. 各分位点のデータ ポイントをカウントします。

  4. この時点で、上位 10% の最小ポイントは、これらの間隔のいずれかに分類されます。この間隔を見つけ(カウントが正確にどこにあるかを教えてくれるので、これは簡単です)、より大きな分位数のカウントの合計と関連する分位数を使用して、この間隔の 10% ポイントを見つけます。

  5. データをもう一度調べて、見つけたポイントよりも大きいポイント以外のすべてを除外します。

この一部には、UDF が必要になる場合があります。

于 2012-10-04T06:05:19.000 に答える