0

いくつかのフィールドをグループ化して射影することにより、テーブルに最大集計関数を適用しようとしています。集計プロジェクションで元のテーブルの他の非グループ化フィールドを参照できますか?

例として、スキーマ (user_id: long、order_id: long、product_id: long、gender: chararray、size: int) を持つテーブル blah があります。user_id、order_id、および product_id は複合キーを作成しますが、複数のユーザー ID が存在する可能性があります。注文ID。使用する各注文の最大サイズを取得するには

result_table = foreach (group blah by (user_id, order_id)) generate
   FLATTEN(group) as (user_id, order_id),
   MAX(blah.size) as max_size;

result_table の作成に product_id を追加して、user_id、order_id、product_id、および max_size を含むテーブルを作成する方法はありますか (max_size は異なる product_id で複製されます)。

グループ化された各 user_id と order_id に固有の product_id を参照できれば、このフィールドにアクセスするために元のテーブルと結合し直す必要がなくなり、mapreduce ジョブを節約できます。みんなありがとう。

4

1 に答える 1

0

Pig はそのようなことに適しています。バッグがあり、SQL で追加の結合を必要とすることを実行できます。

次の場合:

grp = group blah by (user_id, order_id);
describe grp;

「何とか」のスキーマと同じスキーマを持つバッグがあることがわかります (group:(user_id:long, order_id: long), blah: {(user_id: long, order_id: long, product_id: long のようなもの) 、性別: 文字配列、サイズ: int)})。内部結合を使用せずに、各行にグループ サマリーを含む元のすべての行を含む出力を作成できるため、これは非常に強力です。

grp = group blah by (user_id, order_id);
result_table = foreach grp generate 
   FLATTEN(blah.(user_id, order_id, product_id)), -- flatten the bag created by original group
   MAX(blah.size) as max_size;

user_id、order_id のグループ内で同じ product_id が複数回出現する場合は、重複を避けるために、FOREACH にネストされた DISTINCT を使用できます。

grp = group blah by (user_id, order_id);
result_table = foreach grp {
    dist = distinct blah.(user_id, order_id, product_id); -- remove duplicates
    generate flatten(dist), MAX(blah.size) as max_size;
}

これは、単一の MapReduce ジョブで実行されます。

于 2012-11-21T10:29:11.600 に答える