pig优化器之一(翻译pig wiki):combiner使用

Combiner

  1何时使用combiner参数

      combiner通常用在非嵌套 的foreach语句中,且此foreach语句中的所有投影运算(projections)都是group(pig的bag被执行group语句之后,默认会有一个group字段)字段中的列表达式或者代数UDF上的表达式。实例如下:
  

A = load 'studenttab10k' as (name, age, gpa);
B = group A by age;
C = foreach B generate ABS(SUM(A.gpa)), COUNT(org.apache.pig.builtin.Distinct(A.name)), (MIN(A.gpa) + MAX(A.gpa))/2, group.age;
explain C;
  上面的语句中

    (1)group声明可以作为一个整体来引用或者一个单独的字段引用。

    (2)group声明和它其中的元素可以在任何投影运算中出现。

上面语句中,多种表达式都可以应用到代数函数中。包括:

         (1)列转换函数如ABS可以应用到如SUM这样的代数运算函数中。

         (2)代数运算函数(COUNT)同样也可以应用到代数运算函数(DISTINCT)中,但是仅仅是内部的函数是由combiner计算得到的。

    (3)数学表达式可以应用到一个或多个代数函数中。

可以通过运行EXPLAIN函数(上面代码最后一句)来检查你的查询是否使用了combiner。

combiner同样可以使用在嵌套语句,当且仅当该嵌套语句中只有DISTINCT操作。如下:

A = load 'studenttab10k' as (name, age, gpa);
B = group A by age;
C = foreach B { D = distinct (A.name); generate group, COUNT(D);}
   最后,combiner的使用是受GROUPFOREACH声明的周围语法环境影响的

 2 何时不使用combiner

  当操作符处于GROUP和FOREACH语句声明之间时不使用combiner。甚至即使它们仅仅在脚本中相邻的位置,优化器会重新安排它们。下面的实例中,优化器会将FILTER操作移动到FOREACH语句之上,以阻止它使用combiner。

A = load 'studenttab10k' as (name, age, gpa);
B = group A by age;
C = foreach B generate group, COUNT (A);
D = filter C by group.age <30;

注意:上面的规则有一个关于LIMIT的特例,自pig 0.9版本之后,即便是LIMIT处于GROUPFOREACH之间,还是会使用combiner的。下面的代码总优化器会将LIMIT调整到FOREACH之前,但这并不会阻止combiner的使用。

A = load 'studenttab10k' as (name, age, gpa);
B = group A by age;
C = foreach B generate group, COUNT (A);
D = limit C 20;
当多个 FOREACH关联同一个 GROUP时, combiner不会被使用。

A = load 'studenttab10k' as (name, age, gpa);
B = group A by age;
C = foreach B generate group, COUNT (A);
D = foreach B generate group, MIN (A.gpa). MAX(A.gpa);
.....



   

   

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值