计算PIG |的平均值和其他东西

时间:2015-04-28 07:23:49

标签: hadoop hive apache-pig hadoop2

我是PIG的新手,因此是绝对的初学者。

我有一个.txt文件,其条目如下所示:



Name         Matriculation Number Grade Name of Subject           ECTS
John William 078932832            2.7   Research                  5
John William 078932832            2.3   International Management  10
John William 078932832            1.7   Math                      5




正如您所看到的,在文本文件中,有许多关于同一个人的条目,但不同的科目(当然)不同的等级。 我想计算每个学生的平均成绩。对于样本数据,我必须执行以下操作才能获得平均成绩: (2.7 * 5 + 2.3 * 10 + 1.7 * 5)/ 20(ects点的绝对数量)。这个例子的结果是2.25。应该为列表中的每个学生制定此程序。最后,我想要一个包含以下内容的spearate .txt文件:



Name         Matriculation Number Average Grade Number of Subjects Number of ECTS
John William 078932832            2.25          3                  20




我怎样才能用PIG做到这一点?由于我是初学者,请提供获得结果所需的所有步骤。

谢谢!

3 个答案:

答案 0 :(得分:2)

尝试以下猪脚本。

a = load '/pathtodata' as (name, matrix, grade, subject, ECTS); 
b = group a by (name, matrix);
c = foreach b {avg = AVG(a.grade);count = COUNT(a.subject); sum= SUM(a.ECTS); generate group,avg,count,sum;};
d = foreach c generate flatten($0), flatten($1), flatten($2), flatten($3);
dump d;

确保您的数据与选项卡分开以运行此脚本,或者在您的加载命令中使用PigStorage(' delimotor')为任何其他人。

答案 1 :(得分:0)

脚本运行正常,但平均成绩未正确计算! 现有的逻辑是总结所有等级并将其除以计数。 但是每个等级必须与其得分相乘,然后加到另一个等级(它也必须与其等点相乘等等)。完成此操作后,“等级总和”必须除以每个学生的学分数。

答案 2 :(得分:0)

试试这个..

a = load '/piggrade.txt'  as (name:chararray, matrix:chararray, grade:double, subject:chararray, ECTS:long); 
n = foreach a GENERATE  name,matrix,(grade * ECTS) as (totgrades:double),subject,ECTS;


e = group n by (name, matrix);

f = foreach e 

   {
   GENERATE   flatten(group) as (name,matrix),SUM(n.totgrades) as tg,SUM(n.ECTS) as sm,COUNT(n.subject) as sub;
} 
g = foreach f GENERATE name,matrix,(tg/sm) as (Avg:double),sub,sm;
dump g;

输入文件必须以制表符分隔