私はのようないくつかのトランザクションデータを持っています
txn_id、receiver_userid、sender_userid、amount
1,1,2,50
2,1,2,100
3,1,2,500
4,5,3,100
5,5,3,200
6,5,3,300
7,6,2,200
8,6,1,200
同じ別のユーザーから2つ以上のトランザクションを受信したすべてのレシーバーユーザーを検索したいので、PIGジョブを次のように記述し始めました。
txnrecord = LOAD './txndata' USING PigStorage(',') AS (txn_id:int, receiver_userid:int, sender_userid:int, amount:int);
grptxn1 = GROUP txnrecord BY (receiver_userid, sender_userid);
txncount = FOREACH grptxn1 GENERATE FLATTEN(group) as (receiver_userid, sender_userid), COUNT(txnrecord) as num_txns, SUM(txnrecord.amount) as total_sum;
txncount1 = FILTER txncount by num_txns > 2;
dump txncount1;
上記は正しいグループ集計を提供していますが、追加の要件は次のとおりです。
1)集約されたグループレコードとそれに関連するタプルのセット(個々のtxns)を検索します。たとえば、グループの集約で、ユーザーID1がユーザーID2から3つのトランザクションを受信したと表示された場合、3つのタプルすべてを別のデータファイルに保存する必要があります。
2)2を超えるトランザクション条件に一致しないグループ集計は無視する必要があります(ここでは、最後の2つのレコードを無視する必要があります)
3)グループアグリゲートにシーケンスを割り当てたいので、関連付けられたトランザクションタプルのリンクキーとして同じシーケンスを使用する必要があります(これらの3つのトランザクションレコードが特定のグループアグリゲートに関連付けられていることを識別するため)。
いろいろな機能を使って実験していますが、今のところ運が悪いです。
Thxさん、ヘルプポインタをいただければ幸いです。