我是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做到这一点?由于我是初学者,请提供获得结果所需的所有步骤。
谢谢!
答案 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;
输入文件必须以制表符分隔