Pig脚本可以在单个记录中获取前3个数据

时间:2013-10-17 07:06:37

标签: apache-pig

我有样本数据

user_id, date, accessed url, session time
数据是指用户的前3个兴趣,具体取决于会话时间。

使用代码获取数据:

top3 =  FOREACH DataSet{
    sorted = ORDER DataSet BY sessiontime DESC;
    lim    = LIMIT sorted 3;
    GENERATE flatten(group), flatten(lim);
};

输出:

    (1,20,url1,2484)
    (1,20,url2,1863)
    (1,20,url3,1242)
    (2,22,url4,484)
    (2,22,url5,63)
    (2,22,url6,42)
    (3,25,url7,500)
    (3,25,url8,350)
    (3,25,url9,242)

但我希望我的输出是这样的:

(1,20,url1,url2,url3)
(2,22,url4,url5,url6)
(3,25,url7,url8,url9)

请帮忙。

1 个答案:

答案 0 :(得分:0)

你很亲密。问题是当你真的想要将它们全部保存在一条记录中时,你FLATTEN了一袋URL。所以这样做:

top3 =  FOREACH DataSet{
    sorted = ORDER DataSet BY sessiontime DESC;
    lim    = LIMIT sorted 3;
    GENERATE flatten(group), lim.url;
};

根据您获得的输出,您现在将获得

(1,20,{(url1),(url2),(url3)})
(2,22,{(url4),(url5),(url6)})
(3,25,{(url7),(url8),(url9)})

请注意,网址包含在包中。如果您想将它们作为三个顶级字段,则需要使用UDF将包转换为元组,然后FLATTEN