从pig拉丁语中的组操作获取过滤的元组

xeufq47z  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(354)

我有一些交易数据
txn\u id,接收方\u userid,发送方\u 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) 查找聚合的组记录及其关联的元组集(单个txn),例如-如果我的组聚合说userid1从userid2接收了3个事务,那么我需要将所有三个元组存储在另一个数据文件中。
2) 应忽略不匹配>2事务条件的组聚合(此处应忽略最后两条记录)
3) 我想将序列分配给我的组聚合,并且相同的序列应该用作它们关联的事务元组中的链接键(以标识这三个事务记录与特定的组聚合相关联)。
我正在用各种函数做实验,但到目前为止还没有成功。
谢谢你的帮助,谢谢。

fkaflof6

fkaflof61#

您可以携带由分组创建的包,它们包含所有的原始列,以检查它吗

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;

在mapreduce中,如果不让它变得非常慢或使用一些网络化的id代理,就很难实现需求3。可能您不需要它,因为flatten(txnrecord)将转储输入文件中存在的所有列。

相关问题