[原创] 在Apache Pig中把数据按指定字段分组,每组取时间最新的一条记录

查看更多Apache Pig的教程请点击这里

用Apache Pig处理大数据时,经常会有这种需求:把输入数据按指定的字段group,并且每个group内只输出时间最新的一条记录。

举个例子。有数据文件 input.txt :

10      a       1,2,3
9       b       1,2
8       a       2,3,4
13      a       1,2,3,4
6       b       1

该数据的三个字段分别代表:time(时间戳),userId(用户id),userInterest(用户兴趣id)
现在,要找出每个用户时间最新的
userInterest,应该怎么做?
即:对用户 a,最新的时间戳是13,userInterest是1,2,3,4;对用户 b,最新的时间戳是9,userInterest是1,2。
直接上代码:

A = LOAD 'input.txt' AS (timelong, userId: chararray, userInterest: chararray);
A = FOREACH A GENERATE time, userId, userInterest;
B = GROUP A BY userId;
-- 每个userId取时间最新的一条记录
C = FOREACH B {
    SORTED = ORDER A BY time DESC;
    ONE_RECORD = LIMIT SORTED 1;
    GENERATE FLATTEN(ONE_RECORD);
};
DUMP C;

在嵌套的FOREACH语句中,首先用ORDER BY对同一个group内的数据进行了降序排序,再用LIMIT取一条记录,由于是按time降序排序,因此LIMIT 1取到的就是时间戳最大的那条记录,即时间最新的记录。
输出:

(13,a,1,2,3,4)
(9,b,1,2)

可见这个结果和我们前面人工判断出来的正确结果一致。

文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤ 
转载需注明出处:codelast.com 
感谢关注我的微信公众号(微信扫一扫):
wechat qrcode of codelast
以及我的微信视频号:

发表评论