0

私はのようないくつかのトランザクションデータを持っています

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さん、ヘルプポインタをいただければ幸いです。

4

1 に答える 1