查看更多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 (time: long, 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
感谢关注我的微信公众号(微信扫一扫):
以及我的微信视频号: