【问题标题】:Calculate average in PIG | and other things计算 PIG 中的平均值 |和其他东西
【发布时间】: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 做到这一点?由于我是初学者,请提供获得结果所需的所有步骤。

谢谢!

【问题讨论】:

    标签: hadoop hive apache-pig hadoop2


    【解决方案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 应该是输出。
      • 刚才我给出了小数截断的答案,如果答案有用请参考stackoverflow.com/questions/29922857/…。请接受它
      猜你喜欢
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      相关资源
      最近更新 更多