最も読みやすい方法はORDER
、データを参照してから、次のようにトップ レコードを選択することLIMIT 1
です。
A = LOAD 'input' AS (rollno, marks);
B = ORDER A BY marks DESC;
C = LIMIT B 1;
DUMP C;
(3,50)
しかし、Pig がそれを達成するために生成する MapReduce ジョブの数という点では、これはあまり効率的ではありません。データをロードする 1 つのマップのみのジョブ、データをサンプリングする別のジョブ ( で必要)、実際に並べ替えを行う別のジョブ、および出力ORDER BY
を実行する最後のジョブがあります。LIMIT
その単純なタスクの 4 つのジョブ。これを実行するのに 1:54 かかりましたが、その時間のほぼすべてが MapReduce のオーバーヘッドに費やされました。
ただし、入力がそれほど大きくない場合は、ネストされた foreach を使用するだけで、すべての作業が 1 つのレデューサーで行われます。これはスケーラブルではありませんが、すべてのステップで MapReduce を使用するよりもはるかに高速です。最初にすべてを 1 つのレコードにグループ化してから、ネストされた foreach を使用します。
A = LOAD 'tmp/data.txt' AS (rollno, marks);
B = GROUP A ALL;
C = FOREACH B {
ord = ORDER A BY marks DESC;
top = LIMIT ord 1;
GENERATE FLATTEN(top);
};
DUMP C;
(3, 50)
これは 1 つの MapReduce ジョブのみを使用し、0:35 かかりました。
もちろん、MapReduce のオーバーヘッドが問題となるほどデータが小さい場合、Pig はその作業に適したツールではない可能性があります。しかし、少量のデータに対して大量のジョブを生成していて、Pig を使用する必要がある場合は、ネストされた foreach を使用してみる価値があります。