Pig Aggregate功能

时间:2014-07-13 12:40:36

标签: apache-pig

我的输入文件位于

之下
a,t1,1000,100
a,t1,2000,200
b,t2,1000,200
b,t2,5000,100

如何在上述文件中查找不同$ 0的计数。

myinput = LOAD' file' AS(A1:chararray,A2:chararray,AMT:INT,速率:INT);

在上面的脚本之后需要做什么。 我也可以使用那个不同的计数来划分其他一些是不同的关系

2 个答案:

答案 0 :(得分:3)

首先,您读取数据的方式不正确。如果您尝试转储“myinput”,您将看到整个行在第一个字段(a1)中读取,而其他行为空。 原因是您没有指定LOAD函数,默认函数是PigStorage()内置函数,它需要制表符分隔文件(因此它会忽略您的逗号!)。您需要通过using子句显式指定一个加载函数(例如PigStorage())并传递参数:

myInput = LOAD file' using PigStorage(',');
myInput2 = FOREACH myInput GENERATE $0 as (a1:chararray), $1 as (a2:chararray), $2 as (amt:int), $3 as (rate:int);

继续,首先要找到DISTINCT $ 0,你必须在单独的关系中提取字段$ 0。原因是 DISTINCT语句适用于整个记录,而不是单独的字段。

myField = FOREACH myInput2 GENERATE a1;
distinctA1 = DISTINCT myField;

现在,distinctA1的结果是{(a),(b)}。现在使用全部组合,您将所有记录组合在一起,然后剩下的就是对它们进行计数:

grouped = GROUP distinctA1 all;
countA1 = FOREACH grouped GENERATE COUNT(distinctA1);

现在你很高兴。 :)  完整的代码:

myInput = LOAD 'file' using PigStorage(',');
myInput2 = FOREACH myInput GENERATE $0 as (a1:chararray), $1 as (a2:chararray), $2 as    (amt:int), $3 as (rate:int);
a1 = FOREACH myInput2 GENERATE a1;
distinctA1 = DISTINCT a1;
grouped = GROUP distinctA1 all;
countA1 = FOREACH grouped GENERATE COUNT(distinctA1);

答案 1 :(得分:0)

您可以这样做:

myInput = LOAD 'file.txt' USING PigStorage(',') AS (a1:chararray,a2:chararray,amt:int,rate:int);
Data = GROUP myInput BY $0;
Data = FOREACH Data GENERATE $0;
Data = GROUP Data ALL;
Data = FOREACH Data GENERATE $0,COUNT($1);

注意:通过对0美元进行分组,您可以做同样的事情,并获得更好的表现;)