Apache pig 清管器分组功能

Apache pig 清管器分组功能,apache-pig,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 在这之前我写了一个猪的剧本,但是在那之后我不知道如何继续,有人能帮我吗 A = LO

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

以下是输入详细信息

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
在这之前我写了一个猪的剧本,但是在那之后我不知道如何继续,有人能帮我吗

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中使用聚合函数


如何获得购买的预期商品?

我希望这对您有用

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)

在嵌套的foreach中使用bags和orderby,它将只使用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等也很方便,但假设您有一个脚本,其中包含数百行和数十个group by和join操作,这些操作使用“$”进行投影,那么通过这些脚本了解信息流/列是一场噩梦。在维护和更改这些脚本上浪费的时间是巨大的。

是的。谢谢你…看起来不错。我试试这个。我们也可以使用秩的概念来实现相同的逻辑。这个解决方案在SQL风格中太多了,Pig不是SQL,它有包。此解决方案将强制2个MR jobs,而不是1个。