UDTF


UDTF:User-Defined Table-Generating Functions,用戶定義表生成函數,用來解決輸入一行輸出多行

UDF只能實現一進一出的操作,單條記錄的列進行的計算操作

UDAF實現多進一出的操作,基於表的所有記錄進行的計算操作,

  • 函數類需要繼承UDAF類,計算類Evaluator實現UDAFEvaluator接口
  • Evaluator需要實現UDAFEvaluator的init、iterate、terminatePartial、merge、terminate這幾個函數。

       a)init函數實現接口UDAFEvaluator的init函數。
       b)iterate接收傳入的參數,並進行內部的迭代。其返回類型為boolean。
       c)terminatePartial無參數,其為iterate函數遍歷結束后,返回遍歷得到的數據,terminatePartial類似於 hadoop的Combiner。
       d)merge接收terminatePartial的返回結果,進行數據merge操作,其返回類型為boolean。
       e)terminate返回最終的聚集函數結果。

package hive.udaf;  
  
import org.apache.hadoop.hive.ql.exec.UDAF;  
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;  
  
public class Avg extends UDAF {  
    public static class AvgState {  
        private long mCount;  
        private double mSum;  
  
    }  
  
    public static class AvgEvaluator implements UDAFEvaluator {  
        AvgState state;  
  
        public AvgEvaluator() {  
            super();  
            state = new AvgState();  
            init();  
        }  
  
        /** 
         * init函數類似於構造函數,用於UDAF的初始化 
         */  
        public void init() {  
            state.mSum = 0;  
            state.mCount = 0;  
        }  
  
        /** 
         * iterate接收傳入的參數,並進行內部的輪轉。其返回類型為boolean * * @param o * @return 
         */  
  
        public boolean iterate(Double o) {  
            if (o != null) {  
                state.mSum += o;  
                state.mCount++;  
            }  
            return true;  
        }  
  
        /** 
         * terminatePartial無參數,其為iterate函數遍歷結束后,返回輪轉數據, * terminatePartial類似於hadoop的Combiner * * @return 
         */  
  
        public AvgState terminatePartial() {  
            // combiner  
            return state.mCount == 0 ? null : state;  
        }  
  
        /** 
         * merge接收terminatePartial的返回結果,進行數據merge操作,其返回類型為boolean * * @param o * @return 
         */  
  
        public boolean merge(AvgState avgState) {  
            if (avgState != null) {  
                state.mCount += avgState.mCount;  
                state.mSum += avgState.mSum;  
            }  
            return true;  
        }  
  
        /** 
         * terminate返回最終的聚集函數結果 * * @return 
         */  
        public Double terminate() {  
            return state.mCount == 0 ? null : Double.valueOf(state.mSum / state.mCount);  
        }  
    }  
}

  

  1. hive>add jar /home/hadoop/udaf_avg.jar  
  2. hive>create temporary function udaf_avg 'hive.udaf.Avg'  
  3. hive>drop temporary function udaf_avg  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM