从Pig Latin中的组操作中获取已过滤的元组

时间:2012-11-21 08:45:53

标签: hadoop apache-pig

我有一些交易数据,如

txn_id,receiver_userid,sender_userid,金额

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),例如 - 如果我的组聚合说用户ID 1从用户ID 2收到3个事务,我需要将所有三个元组存储在另一个数据文件中。 / p>

2)不匹配的组聚合>应忽略2个事务条件(此处应忽略最后两个记录)

3)我想将序列分配给我的组聚合,并且相同的序列应该用作其关联事务元组中的链接密钥(以识别这三个事务记录与特定组聚合相关联)。

我正在尝试使用各种功能,但到目前为止还没有运气。

感谢任何帮助指针,Thx。

1 个答案:

答案 0 :(得分:0)

您可以携带GROUP BY创建的BAG,它们包含所有原始列,以便检查它

DESCRIBE grptxn1;

回答要求1和2:

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), 
txnrecord, -- carry bags through the filter
COUNT(txnrecord) as num_txns, SUM(txnrecord.amount) as total_sum ;
txncount1 = FILTER txncount by num_txns > 2;
tran_dump = FOREACH  txncount1 GENERATE FLATTEN(txnrecord);
STORE tran_dump INTO 'another data file';

txncount2 = FOREACH txncount1 GENERATE (receiver_userid, sender_userid, num_txns, total_sum);
dump txncount2;

要求3在MapReduce中不容易做到,而不会让它变得非常慢或使用某些网络ID代理。也许你不需要它,因为FLATTEN(txnrecord)会转储输入文件中的所有列。