写的一个内部使用的UDAF,参照hive的sum和这位大哥的udafhttp://www.fuzhijie.me/?p=118,经过n多次的尝试终于成功了!!!

话不多说,直接上代码:

 

package hive.IRUDAF2;

import org.apache.hadoop.hive.ql.exec.UDAF;   
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;   
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.commons.lang.StringUtils;

//
/*掩码计算:
 * *ibit=(hour*60+min)/5
 * ibit=0——5掩码第0位置1,5——10掩码第1位置1,以此类推
 */

public class IRMask extends UDAF{   
         
     public static class IRorEvaluator implements UDAFEvaluator{
         
          public    static String sResult; 
          public char chTemp [] =  new char[400];           
          public IRorEvaluator(){ 
                  super();
                  sResult = new String(); 

               init();   
          }   
             
          /*  
          *init函数类似于构造函数,用于UDAF的初始化  
          */  
          public void init(){   
               //score.pSum = 0;   
             
              sResult = new String();
              for(int i=0 ; i<40 ; i++)
                 sResult += "0000000000";
              chTemp = sResult.toCharArray();
          }   
             
          /*  
          *iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean  
          *类似Combiner中的mapper  
          */  
          public boolean iterate(Text in1){   
               if(in1 != null){                   
                   int iBit =  ChangeVstartToInt(in1.toString());
                 // score.sResult.setCharAt(score.iBit, \'1\');
                 
                    if( 0<=iBit && iBit<288)
                    {                                                   
                        chTemp[iBit] = \'1\';
                        sResult = String.valueOf(chTemp);
                    }
                
               }   
               
               return true;   
          }   
             
          /*  
          *terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据  
          *类似Combiner中的reducer  
          */  
          public String terminatePartial(){   
               return  sResult ;   
          }   
             
          /*  
          *merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean  
          */  
          public boolean merge(String in1) //in1是terminatePartial传入的结果
          {    //merge的时候要和iterate差不多的计算,相当于把iterate计算得出的结果合并。
              for(int j=0 ;j<288 ;j++ )
              {
                  if(in1.charAt(j) == \'1\')
                      chTemp[j] = \'1\';
              }
              sResult = String.valueOf(chTemp);
               return true;   
          }   
             
          /*  
          *terminate返回最终的聚集函数结果  
          */  
          public Text terminate(){               
              return new Text(sResult);               
          }   
          
     
         public int ChangeVstartToInt(String vstart)
         {
                 String arrStart[] =vstart.split(" ");
                String arrStart2[] = arrStart[1].split(":");
                int lHour = changeStringToInt(arrStart2[0]);
                int lMinute = changeStringToInt(arrStart2[1]) ;      
                return (lHour*60 + lMinute)/5; //5分钟一个位
         }
          public  boolean isNumeric(String str)
          {
            for (int i = str.length();--i>=0;)
            {   
             if (!Character.isDigit(str.charAt(i)))
             {
              return false;
             }
            }
            return true;
           }

          public int changeStringToInt(String str)
          {
              int iResult=0;
              if( str.length()!=0 && isNumeric(str) )
                  iResult = Integer.parseInt(str);
              if( iResult <0 || iResult >=288)
                  iResult=0;
              return iResult;
          }
     }           
}

版权声明:本文为tangtianfly原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tangtianfly/p/2751578.html