分享

hive中如何实现自定义的count呢?

luo3601721 发表于 2014-10-10 14:49:13 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 11557
最近学习hive写udaf,想实现自定义count,判断如果字段为1就计数,代码如下:
  1. <P> package com.job;</P>
  2. <P>import org.apache.hadoop.hive.ql.exec.UDAF;
  3. import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
  4. import org.apache.hadoop.io.IntWritable;</P>
  5. <P>
  6. public class MaxiNumber extends UDAF{</P>
  7. <P> public static class MaxiNumberIntUDAFEvaluator implements UDAFEvaluator{
  8.   
  9.   private IntWritable result;
  10.   @Override
  11.   public void init() {
  12.    result=null;
  13.   }
  14.   
  15.   public boolean iterate(IntWritable value){
  16.    if(null == value){
  17.     return false;
  18.    }
  19.    else if(null == result){
  20.     result=new IntWritable(0);
  21.     return true;
  22.    }
  23.    else{</P>
  24. <P>      if(value.get()==1){
  25.             result.set(result.get()+1);</P>
  26. <P>      }
  27.     return true;
  28.    }
  29.   }
  30.   
  31.   public IntWritable terminatePartial(){
  32.    return result;
  33.   }
  34.   
  35.   public boolean merge(IntWritable other){
  36.    return iterate(other);
  37.   }
  38.   
  39.   public IntWritable terminate(){
  40.    return result;
  41.   }
  42. }</P>
  43. <P>}
  44. </P>
复制代码

为什么跑出来结果都是1呢?

已有(6)人评论

跳转到指定楼层
jixianqiuxue 发表于 2014-10-10 17:29:44
这是从哪里复制的哦,还带有html
回复

使用道具 举报

muyannian 发表于 2014-10-10 17:45:43
public boolean iterate(IntWritable value){
   if(null == value){
    return false;
   }
   else if(null == result){
    result=new IntWritable(0);
    return true;
   }
   else{</P>
      if(value.get()==1){
            result.set(result.get()+1);
      }
    return true;
   }
  }

只加1了,但是没有赋值






回复

使用道具 举报

muyannian 发表于 2014-10-10 17:49:09
muyannian 发表于 2014-10-10 17:45
public boolean iterate(IntWritable value){
   if(null == value){
    return false;

  result.set只是数据类型转换, 查看hadoop数据类型及Java数据类型的转换
回复

使用道具 举报

luo3601721 发表于 2014-10-13 21:41:27
已经解决了,谢谢
另外发现hive也支持类似CASE的高级过滤,很方便
回复

使用道具 举报

muyannian 发表于 2014-10-13 21:49:20
luo3601721 发表于 2014-10-13 21:41
已经解决了,谢谢
另外发现hive也支持类似CASE的高级过滤,很方便
解决啦啊,真好。其实我就只懂那么点,能不能贴出来,大家学习一下。
回复

使用道具 举报

luo3601721 发表于 2014-10-16 23:08:40
最后是看hive的count源码仿造来实现的
实际生产环境中用的高级过滤,比如count(CASE WHEN plat=1 THEN u ELSE NULL END)解决一些问题的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条