2

各ユーザーが 1 日に多数のトランザクションを行ういくつかのユーザー アカウントを毎日追跡する Pig ジョブがあります。プロセスの一環として、この PIG は 1 日あたりのユーザーごとにグループ化されたトランザクションを書き出します (余談ですが、Avro を使用します)。

ここで、ユーザー アカウントとプロセスごとに、1 週間 (またはそれ以上の期間) のすべてのトランザクションをグループ化したいと考えています。

PIG では次のように総当たりでこれを行うことができますが、すべてのトランザクションをフラット化して再グループ化するよりも良い方法があるに違いないようです。さらに詳細に ...

機能する開始点 ... (a はユーザー、(b,c) および (d,e) は、(f,g) および (h,i) と同様に 2 つの遷移を表します)

読み込んだ...

(a,{(b,c),(d,e)})  -- From first file - Monday
(a,{(f,g),(h,i)})  -- from second file - Tuesday

が欲しいです ...

(a,{(b,c),(d,e),(f,g),(h,i)})  

私は台本に親しみます…</p>

-- Read in multiple days (one day per file, $input is directory with all files)
DayGroupedRecord = LOAD '$input' USING AvroStorage();
FlattenRecord = FOREACH DayGroupedRecord GENERATE $0 AS Key, FLATTEN ($1);
WeeklyGroup = GROUP FlattenRecord BY $0;

これは与える

(a,{(a,b,c),(a,d,e),(a,f,g),(a,h,i)}) 

これで十分です。ただし、入力レコードはすでに部分的にグループ化されているため、トランザクションごとのレベルでグループを操作する必要があるのは非効率的です。

PIG には、毎日のグループをグループ化してから平坦化する (おそらくより効率的な) 別のアプローチがありますか?

私は試しました(そして失敗しました)...

DayGroupedRecord = LOAD '$input' USING AvroStorage();
WeeklyGroupNested = GROUP DayGroupedRecord  BY $0;
WeeklyGroup = FOREACH WeeklyGroupNested GENERATE FLATTEN($1);

グループ作戦は有望に見えます…</p>

(a,{(a,{(b,c),(d,e)}),(a,{(f,g),(h,i)})})

しかし、上記のバッグの内側を平らにする方法を見つけることができません..スクリプトは、私が始めたところに戻ってきました...平らにするために多くのバリエーションを試しましたが、成功しませんでした(ほとんどの場合、 PIG エラー)。

これは私が取得したものであり、上記のスクリプトを使用したものです (私が望むものではありません)。

(a,{(b,c),(d,e)})
(a,{(f,g),(h,i)})

PIG の初心者として、Pig に内側のバッグを平らにしてもらい、必要なものに近づけることができます。

(a,{(b,c),(d,e),(f,g),(h,i)})  

フィル

4

1 に答える 1

0

GROUP「ブルート フォース」方式を試して、リソースの消費量を、トランザクションを 1 つのバッグに入れようとすることを忘れた場合と比較しましたか? 力ずくの方法が洗練されているとは思わないかもしれませんが、それが何をしているのか、そしてそれが本当に非効率なのかどうかを考えてみてください。

理想的な方法は、ユーザーごとにグループ化し、グループ化されたすべてのバッグをマージすることです。これは、入力レコードごとにキーとトランザクションのバッグをリデューサーに送信することを意味します。そこから、各トランザクションを引き出して、そのユーザーの最終的なバッグに入れながら、バッグを繰り返し処理する必要があります。

ブルート フォース方式ではFLATTEN、各入力レコードの各トランザクションに対して、キーとトランザクションをリデューサーに送信します。ここでは、ユーザー ID を繰り返し送信することで重複が発生しますが、特にトランザクション データのサイズがユーザー ID のサイズよりもはるかに大きい場合は、それほど大きな問題ではありません。そこから、各トランザクションをそのユーザーの最終バッグに追加するだけです。

これは私には特に非効率に思えませんし、追加の map-reduce ステップも必要ありません。マッパーからレデューサーに送信されるデータのサイズは、ほぼ同じです。計算中に 1 日のトランザクションをまとめてグループ化しようとしても、パフォーマンスが大幅に向上することはないと思います。

于 2013-11-11T14:03:03.183 に答える