在单个记录中获取前3个数据的pig脚本

watbbzwu  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(217)

我有样本数据 user_id, date, accessed url, session time 根据会话时间,数据指的是用户最感兴趣的三个方面。
使用代码获取数据:

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)

请帮忙。

yx2lnoni

yx2lnoni1#

你很接近。问题是你 FLATTEN 当你真的想把所有的网址都保存在一个记录里的时候。因此,请改为:

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)})

请注意,url包含在一个包中。如果您想将它们作为三个顶级字段,则需要使用自定义项将包转换为元组,然后 FLATTEN 那个。

相关问题