假设我有 intput_file.txt(user_id、event_code、event_date):
1,a,1
1,b,2
2,a,3
2,b,4
2,b,5
2,b,6
2,c,7
2,b,8
如你所见,user_id = 2,有这样的事件:abbbcb
我想要这样的结果:
1,{(a,1),(b,2)}
2,{(a,2),(b,6),(c,7),(b,8)}
所以当我们有几个事件时,使用相同的代码,我想只处理最后一个。
你能分享一些提示吗?
问候 帕维尔
最佳答案
您描述的主要内容是 GROUP BY
的作用。
在这种情况下:
B = GROUP A BY user_id;
通过 user_id
获取您的记录。您的数据现在将如下所示:
1,{(a,1),(b,2)}
2,{(a,2),(b,6),(c,7),(b,8)}
您说您只想要最后一个(我假设您指的是具有最大 event_date
的那个)。为此,您可以使用 ORDER BY
执行嵌套的 FOREACH
以按日期排序,然后使用 LIMIT
获取第一个。请注意,当存在关系时,这具有任意行为。
C = FOREACH B {
DA = ORDER A BY event_date DESC;
DB = LIMIT DA 1;
GENERATE FLATTEN(group), FLATTEN(DB.event_code), FLATTEN(DB.event_date);
}
您的数据现在应该如下所示:
1,b,2
2,b,8
另一种选择是使用 UDF 在 GROUP BY
给出的组上编写一些自定义行为:
B = GROUP A BY user_id;
C = FOREACH B GENERATE YourUDFThatYouBuilt(group, A);
在该 UDF 中,您可以编写任何您想要的自定义行为(在本例中返回具有最晚日期的元组)
关于hadoop - Pig - 如何只从列表中选择一些值(不仅仅是简单的不同)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21233266/