各ユーザーが 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)})
フィル