【问题标题】:Can i do distinct on multiple columns in pig?我可以在猪的多个列上做不同的吗?
【发布时间】:2013-03-06 09:45:05
【问题描述】:

我有一个用例,我需要计算两个字段的不同数量。

示例:

x = LOAD 'testdata' using PigStorage('^A') as (a,b,c,d);

y = GROUP x BY a;

z = FOREACH y {

        **bc = DISTINCT x.b,x.c;**
        dd = DISTINCT x.d;
        GENERATE FLATTEN(group) as (a), COUNT(bc), COUNT(dd);
};

【问题讨论】:

    标签: apache-pig


    【解决方案1】:

    你已经很接近了。关键是不要将DISTINCT 应用于两个字段,而是将其应用于您创建的单个复合字段:

    x = LOAD 'testdata' using PigStorage('^A') as (a,b,c,d);
    x2 = FOREACH x GENERATE a, TOTUPLE(b,c) AS bc, d
    y = GROUP x2 BY a;
    z = FOREACH y {
            bc = DISTINCT x2.bc;
            dd = DISTINCT x2.d;
            GENERATE FLATTEN(group) AS (a), COUNT(bc), COUNT(dd);
    };
    

    【讨论】:

    • 所以我们可以说不可能在每列中应用 distinct,相反,我们可以创建一个单独的 distinct 然后执行查询!很好,乐于助人
    【解决方案2】:

    恕我直言,没有简单的方法(例如 MySQL 中的 GROUP(DISTINCT a)),因此您需要拆分表以使每行计数两次。

    x = LOAD 'testdata' using PigStorage('^A') as (a,b,c,d);
    
    w1 = FOREACH x GENERATE a, CONCAT(b,c) AS bc;
    w2 = FOREACH x GENERATE a, d;
    
    v1 = DISTINCT w1;
    v2 = DISTINCT w2;
    
    u1 = GROUP v1 BY a;
    u2 = GROUP v2 BY a;
    
    t1 = FOREACH u1 GENERATE group AS a, COUNT(v1.bc);
    t2 = FOREACH u2 GENERATE group AS a, COUNT(v2.d);
    
    s = JOIN t1 BY a, t2 BY a;
    

    UDF 可以大大简化这一过程。

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 1970-01-01
      • 2023-03-29
      • 2018-06-23
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      相关资源
      最近更新 更多