首页 > 解决方案 > 分组时如何获取包中的第一个元组

问题描述

我不明白在生成输出时如何处理重复项,所以我最终得到了几个重复项,但我只想要一个。

我尝试过使用 LIMIT ,但这仅在我想选择时适用。我也使用了 DISTINCT 但我猜是错误的场景。

grouped = GROUP wantedTails BY tail_number;

smmd = FOREACH grouped GENERATE wantedTails.tail_number as Tails, SUM(wantedTails.distance) AS totaldistance;

所以对于我的分组,我得到了像(不是全部)这样的 smg:({(N983JB),(N983JB),(N983JB),(N983JB),(N983JB),(N983JB),(N983JB),(N983JB),( N983JB),(N983JB),(N983JB),(N983JB),(N983JB),(N983JB),(N983JB),(N983JB),(N983JB),(N983JB)},44550)

但我希望(N983JB,44550)。如何删除分组期间生成的那些重复项?谢谢!

标签: apache-pig

解决方案


在我看来,有两种方法可以在 Pig 中删除重复数据。

  1. 不太灵活但方便的方法是MAX在执行GROUP BY. SUM仅当您想在重复项中添加值时才应用:

    dataWithDuplicates = LOAD '<path_to_data>';
    
    grouped = GROUP dataWithDuplicates BY tail_number;
    
    dedupedData= FOREACH grouped GENERATE
              --Since you have grouped on tailNumber, it is already de-duped
              group AS tailNumber, 
              MAX(dataWithDuplicates.distance) AS dedupedDistance,
              SUM(dataWithDuplicates.distance) AS totalDistance;
    
  2. 如果您想在重复数据删除时获得更大的灵活性,您可以借助嵌套FOREACHPig。这个问题抓住了它的使用要点:如何删除在 Pig 中重复的数据行。嵌套 FORACH 的其他参考:https ://www.safaribooksonline.com/library/view/programming-pig/9781449317881/ch06.html


推荐阅读