Pig のテーブルの上位 x% 行を選択する必要があります。UDF を書かずにそれを行う方法を教えてもらえますか?
ありがとう!
前述のように、まずテーブル内の行数をカウントする必要があり、それから明らかに次のことができます。
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
表示されます。
パーセンテージを取得する方法はわかりませんが、テーブルのサイズが 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 クエリを実行する別のジョブ。
豚のコードは書いてテストするのに時間がかかるので書きませんが、次のようにします (正確な解決策が必要な場合、そうでない場合は、より簡単な方法があります)。
各分位点のデータ ポイントをカウントします。
この時点で、上位 10% の最小ポイントは、これらの間隔のいずれかに分類されます。この間隔を見つけ(カウントが正確にどこにあるかを教えてくれるので、これは簡単です)、より大きな分位数のカウントの合計と関連する分位数を使用して、この間隔の 10% ポイントを見つけます。
データをもう一度調べて、見つけたポイントよりも大きいポイント以外のすべてを除外します。
この一部には、UDF が必要になる場合があります。