我想知道,每个人最近都买了什么东西。假设同一个人可以购买很多物品。
以下是输入细节
kumar,2014-09-30,television
kumar,2014-07-27,smartphone
Andrew,2014-06-21,camera
Andrew,2014-05-20,car
我需要输出如下
kumar,2014-09-30,television
Andrew,2014-06-21,camera
我写了一个Pig脚本,但之后我不知道如何继续,有人可以帮助我
A = LOAD 'records.txt' USING PigStorage(',') AS(name:chararray,date:chararray,item:chararray);
B = GROUP A BY name;
C = FOREACH B GENERATE group,MAX(A.date);
但我需要获得每个人最近购买的物品。我怎么做到的。如果我应用GROUP,那么我应该只使用Pig中的聚合函数。
我如何获得已购买的物品?
答案 0 :(得分:0)
在嵌套的foreach中使用行李和订单,它将只使用1个MR作业,并且更多采用Apache Pig风格。
A = LOAD 'input.txt' USING PigStorage(',') AS(name:chararray,date:chararray,item:chararray);
B = GROUP A BY name;
C = FOREACH B {
ordered = ORDER A BY date DESC; -- this will cause secondary sort to optimise the execution
latest = LIMIT ordered 1;
GENERATE FLATTEN(latest); - advantage of PIG, that all columns are preserved and not dropped as on SQL group by
};
DUMP C;
同样使用$ 0,$ 1等是方便的,但想象你有一个包含数百行和数十个分组的脚本以及使用'$'进行项目的连接操作,虽然理解信息/列的流程是个噩梦这样的脚本。浪费在维护上的时间和对这些脚本的更改是巨大的。
答案 1 :(得分:-1)
我希望这适合你。
input.txt
kumar,2014-09-30,television
kumar,2014-07-27,smartphone
Andrew,2014-06-21,camera
Andrew,2014-05-20,car
PigScript:
A = LOAD 'input.txt' USING PigStorage(',') AS(name:chararray,date:chararray,item:chararray);
B = GROUP A BY name;
C = FOREACH B GENERATE group,FLATTEN(MAX($1.date));
D = JOIN A BY date,C BY $1;
E = FOREACH D GENERATE $0,$1,$2;
DUMP E;
Output:
(Andrew,2014-06-21,camera)
(kumar,2014-09-30,television)