【问题标题】:Pig: Get top n values per groupPig:获取每组的前 n 个值
【发布时间】:2013-07-13 10:07:49
【问题描述】:

我有已经分组和汇总的数据,看起来像这样:

user    value      count
----    --------  ------
Alice   third      5
Alice   first      11
Alice   second     10
Alice   fourth     2
...
Bob     second     20
Bob     third      18
Bob     first      21
Bob     fourth     8
...

对于每个用户(Alice 和 Bob),我想检索他们的 前 n 个值(比如说 2),按“计数”排序。 所以我想要的输出是这样的:

Alice first 11
Alice second 10
Bob first 21
Bob second 20

我怎样才能做到这一点?

【问题讨论】:

    标签: hadoop hdfs apache-pig


    【解决方案1】:

    一种方法是

    records = LOAD '/user/nubes/ncdc/micro-tab/top.txt' AS (user:chararray,value:chararray,counter:int);
    grpd = GROUP records BY user;
    
    top3 = foreach grpd {
            sorted = order records by counter desc;
            top    = limit sorted 2;
            generate group, flatten(top);
    };
    

    输入是:

    Alice   third   5 
    Alice   first   11 
    Alice   second  10
    Alice   fourth  2
    Bob second  20
    Bob third   18
    Bob first   21
    Bob fourth  8
    

    输出是:

    (Alice,Alice,first,11)
    (Alice,Alice,second,10
    (Bob,Bob,first,21)
    (Bob,Bob,second,20)
    

    【讨论】:

    • limit 并不能保证您一定会获得最高记录。
    • docs 说,在您 ordered 收藏后进行 limit 确实保证您获得最高记录
    【解决方案2】:

    我刚刚观察到

    top    = limit sorted 2;
    

    top 是一个内置函数,可能会引发错误,所以我唯一做的就是在这种情况下更改了关系的名称,而不是

    generate group, flatten(top);
    

    输出结果

    (Alice,Alice,first,11)
    (Alice,Alice,second,10
    (Bob,Bob,first,21)
    (Bob,Bob,second,20)
    

    修改如下图-

    records = load 'test1.txt' using PigStorage(',') as (user:chararray, value:chararray, count:int);
    grpd = GROUP records BY user;
    top2 = foreach grpd {
            sorted = order records by count desc;
            top1    = limit sorted 2;
            generate flatten(top1);
    };
    

    这给了我你想要的输出 -

    (Alice,first,11)
    (Alice,second,10)
    (Bob,first,21)
    (Bob,second,20)
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-23
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多