计算 PIG 中的平均值 |和其他东西
Posted
技术标签:
【中文标题】计算 PIG 中的平均值 |和其他东西【英文标题】:Calculate average in PIG | and other things 【发布时间】:2015-04-28 07:23:48 【问题描述】:我是 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。应该为列表中的每个学生进行此程序。最后,我想要一个包含以下内容的独立 .txt 文件:
Name Matriculation Number Average Grade Number of Subjects Number of ECTS
John William 078932832 2.25 3 20
如何使用 PIG 做到这一点?由于我是初学者,请提供获得结果所需的所有步骤。
谢谢!
【问题讨论】:
【参考方案1】:试试下面的猪脚本。
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') 以供其他任何人使用。
【讨论】:
您好alekya reddy,非常感谢您的帮助。脚本运行良好,但我没有得到预期的结果;( 您是否使用制表符分隔数据?【参考方案2】:脚本运行良好,但平均成绩计算不正确! 现有的逻辑是将所有等级相加,然后除以计数。 但是每个等级都必须乘以它的ects点,然后添加到另一个等级(它也必须乘以它的ects点等等)。完成此操作后,“成绩总和”必须除以每个学生的 ects 分数。
【讨论】:
【参考方案3】:试试这个..
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;
输入文件必须用制表符分隔
【讨论】:
嗨,Sravan K Reddy,这很有魅力!我不知道这是否是最短的脚本,但它可以完成工作;)是否有可能在小数点后的第一个位置之后剪切所有内容?例如:avgGrade 的结果是 2.672930 => 2.6 应该是输出。 刚才我给出了小数截断的答案,如果答案有用请参考***.com/questions/29922857/…。请接受它以上是关于计算 PIG 中的平均值 |和其他东西的主要内容,如果未能解决你的问题,请参考以下文章