猪分组功能

时间:2014-10-01 06:18:14

标签: apache-pig

我想知道,每个人最近都买了什么东西。假设同一个人可以购买很多物品。

以下是输入细节

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中的聚合函数。

我如何获得已购买的物品?

2 个答案:

答案 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)