【问题标题】:advice to make my below Pig code simple使我的以下 Pig 代码简单的建议
【发布时间】:2016-02-25 20:51:30
【问题描述】:

这是我的代码,我做了两组所有操作,我的代码工作正常。我的目的是生成所有学生的唯一用户计数及其总分,学生位于 CA 唯一用户计数中。想知道是否有好的建议让我的代码变得简单,只使用一个组操作,或者有什么建设性的想法让代码简单,例如只使用一个 FOREACH 操作?谢谢。

student_all = group student all;
student_all_summary = FOREACH student_all GENERATE COUNT_STAR(student) as uu_count, SUM(student.mathScore) as count1,SUM(student.verbScore) as count2;

student_CA = filter student by LID==1;
student_CA_all = group student_CA all;
student_CA_all_summary = FOREACH student_CA_all GENERATE COUNT_STAR(student_CA);

示例输入(学生 ID、位置 ID、mathScore、verbScore),

1 1 10  20
2 1 20  30
3 1 30  40
4 2 30  50
5 2 30  50
6 3 30  50

示例输出(唯一用户、CA 中的唯一用户、所有学生的 mathScore 总和、所有学生的动词分数总和),

7 3 150 240

提前致谢, 林

【问题讨论】:

  • 我不太了解猪,所以不能给你一个确切的答案,但从概念上讲,我认为你希望GROUP student BY (student, LID),将你的数据聚合到更易于管理的大小,但仍然保留然后你需要的粒度,那么你的“FOREACH”聚合会更快
  • @maxymoo,您的意思是仅按位置 (LID) 分组?还是按位置 + 学生证?
  • 将两者分组,然后您将拥有一个大小为#locations * #students 的表格。然后可以选择按位置过滤或总结整个事情以获得您的两种类型的聚合
  • @maxymoo,谢谢,但学生证是唯一的,按学生证+位置ID分组的目的是什么?顺便说一句,如果你能把你的代码写下来,那就清楚了。

标签: hadoop apache-pig


【解决方案1】:

你可能正在寻找这个。

data = load '/tmp/temp.csv' USING PigStorage(' ') as (sid:int,lid:int, ms:int, vs:int);

gdata = group data all;

result = foreach gdata {
        student_CA = filter data by lid == 1; 
        student_CA_sum = SUM( student_CA.sid ) ;
        student_CA_count = COUNT( student_CA.sid ) ;
        mathScore = SUM(data.ms);
        verbScore = SUM(data.vs);
        GENERATE student_CA_sum as student_CA_sum, student_CA_count as student_CA_count, mathScore  as mathScore, verbScore as verbScore;
 };

输出是:

grunt> dump result
    (6,3,150,240)
grunt> describe result
    result: {student_CA_sum: long,student_CA_count: long,mathScore: long,verbScore: long}

【讨论】:

  • 谢谢 Mahendra,你为什么要 COUNT(student_CA.sid),而不是 COUNT(student_CA);
  • 您好 Mahendra,感谢您提供的所有帮助,并将您的回复标记为已回答。周末愉快。 :)
  • @LinMa COUNT(student_CA.sid)COUNT( student_CA) 的结果是一样的,我用错了是因为复制粘贴。
  • 感谢 Mahendra,对于 COUNT(student_CA.sid) 和 COUNT(student_CA),它们的逻辑含义是一样的吗?
  • COUNT(student_CA.sid)COUNT( student_CA) 之间存在细微差异。 COUNT( student_CA) 将计算 student_CA 包中元组的总数(您可以将元组视为行),而 COUNT(student_CA.sid) 将计算 student_CA 包中非空 sid 的数量。因此,假设您在一个袋子中有 5 个条目,其中只有 4 个 sid 并且在第 5 个元组中 sid 为空,那么 COUNT( student_CA) 会给您 5 个,但 COUNT(student_CA.sid) 会给您 4 个。
【解决方案2】:

首先在hadoop文件系统中加载文件(学生)。执行以下操作。

split student into student_CA if locationId == 1, student_Other if locationId != 1;

student_CA_all = group student_CA all;

student_CA_all_summary = FOREACH student_CA_all GENERATE COUNT_STAR(student_CA) as uu_count,COUNT_STAR(student_CA)as locationCACount, SUM(student_CA.mathScore) as mScoreCount,SUM(student_CA.verbScore) as vScoreCount;

student_Other_all = group student_Other all;

student_Other_all_summary = FOREACH student_Other_all GENERATE COUNT_STAR(student_Other) as uu_count,0 as locationOtherCount:long, SUM(student_Other.mathScore) as mScoreCount,SUM(student_Other.verbScore) as vScoreCount;

student_CAandOther_all_summary = UNION student_CA_all_summary, student_Other_all_summary;

student_summary_all = group student_CAandOther_all_summary all;

student_summary = foreach student_summary_all generate SUM(student_CAandOther_all_summary.uu_count) as studentIdCount, SUM(student_CAandOther_all_summary.locationCACount) as locationCount, SUM(student_CAandOther_all_summary.mScoreCount) as mathScoreCount , SUM(student_CAandOther_all_summary.vScoreCount) as verbScoreCount;

输出:

dump student_summary;
(6,3,150,240)

希望这会有所帮助:)

在解决您的问题时,我也遇到了 PIG 的问题。我认为这是因为在 UNION 命令中进行了不正确的异常处理。实际上,如果您执行该命令,它可以挂起您的命令行提示符,而没有正确的错误消息。如果你愿意,我可以为此分享你的 sn-p。

【讨论】:

    【解决方案3】:

    接受的答案有逻辑错误。

    尝试使用以下输入文件

    1 1 10  20
    2 1 20  30
    3 1 30  40
    4 2 30  50
    5 2 30  50
    6 3 30  50
    7 1 10  10
    

    输出将是

    (13,4,160,250)
    

    输出应该是

    (7,4.170,260)
    

    我已修改脚本以使其正常工作。

    data = load '/tmp/temp.csv' USING PigStorage(' ') as (sid:int,lid:int, ms:int, vs:int);
    
    gdata = group data all;
    
    result = foreach gdata {
        student_CA_sum = COUNT( data.sid ) ;
        student_CA = filter data by lid == 1;
        student_CA_count = COUNT( student_CA.sid ) ;
        mathScore = SUM(data.ms);
        verbScore = SUM(data.vs);
        GENERATE student_CA_sum as student_CA_sum, student_CA_count as student_CA_count, mathScore  as mathScore, verbScore as verbScore;
    

    };

    输出

    (7,4,160,250)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多