1

豚から最大値を取得するには:

学生(点数、点数)

rollno. marks

1   24

2   26

3   50

4   30

5   35

出力要件: 最大マーク ロール番号。

出力: 3 50

A に Student テーブルの値が含まれているとします。

ロールノの入手方法。最高点を獲得

私はこれを試しました:

B = GROUP A BY rollno

C = foreach B generate group , max( A.marks);

しかし、それはすべての記録が豚でこれを助けることができるという結果です

4

5 に答える 5

9

最も読みやすい方法は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 を使用してみる価値があります。

于 2013-02-26T15:10:36.967 に答える
3

私の理解によると、最大マークとロール番号を含む単一の行が必要です。

次に、rollno を降順でソートし、以下のような limit キーワードで一番上の行を取得する必要があります

c=order b by marks desc;

d=limit c 1;
于 2013-02-26T09:20:42.830 に答える
1
  a = Load 'data.txt' using PigStorage (',');
  b = group a all;
  c = foreach b GENERATE  MAX(a.$1);
于 2015-06-13T06:31:54.750 に答える
0

これは私のために働いています -

userRollNoWithMarks = Load 'data.txt' using PigStorage (',');
maxNo = FOREACH(GROUP userRollNoWithMarks ALL) GENERATE  MAX(userRollNoWithMarks .$1);
DUMP maxNo ;
于 2016-04-01T16:07:31.700 に答える
-1
B = GROUP A BY rollno;
C = foreach B generate group , MAX($1.$2);
于 2016-01-30T13:40:34.783 に答える