hive UDAF求平均值

2021-08-27 00:26:20 字數 1373 閱讀 8162

最近做資料遷移專案,把聚合部分從kettle遷移到hadoop集群上,需要寫很多聚合指令碼

在論壇是看到alipay同事寫過類似cube的udaf,**拿過來執行下報錯,有幾個地方沒看多,而且沒有注釋,只好從基礎開始看,自己搞乙個,之前寫過udf所以入手還是聽快的

準備:1、實現自己的udaf需要整合udaf

2、至少有乙個內部類,實現了org.apache.hadoop.hive.ql.exec.udafevaluator

3、必須寫 inin方法

4、並且有個方法名叫iterate() 引數任意,這個方法是函式入口

5、並且要有terminatepartial,merge,terminate,算上上面的共5個方法,下面一一講解

public class mean extends udaf

private partialresult presult;

@override

public void init()

public boolean iterate(doublewritable value)

if (presult == null)

presult.sum += value.get();

presult.count++;

return true;

}public partialresult terminatepartial()

public boolean merge(partialresult other)

if (presult == null)

presult.sum += other.sum;

presult.count++;

return true;

}public doublewritable terminate()

return new doublewritable(presult.sum / presult.count);}}

inin()函式可以用來做初始化操作,一般會將統計變數置空,重置內部狀態

iterate方法是函式的入口,引數個數和型別和udaf實現功能息息相關

terminatepartial 需要部分聚集是呼叫該函式,因為計算是不同的資料塊會分到不同的map端,計算之後再傳輸到reduce端,很多計算是可以在map後面繼續計算一次,比如求最大值(求平均值則不可以),這個時候就會呼叫terminatepartial函式,函式必須返回乙個封裝了聚集計算當前狀態的物件,傳入reduce端

merge函式,資料傳輸到reduce端前呼叫該函式,所以入參必須和terminatepartial返回值相同

terminate函式:hive最終聚集時會呼叫terminate,返回計算結果

spark 求平均值

val rdd sc.makerdd list a 1 a 2 a 3 b 1 b 2 b 3 b 4 a 4 2 rdd.combinebykey x x,1 x int,int y int x.1 y,x.2 1 x int int y int int x.1 y.1,x.2 y.2 mapva...

大數求平均值公式

方法1 維護乙個cnt記錄當前資料的個數,evr記錄當前的平均值 然後每增減乙個新資料val時,更新這個cnt和evr的值即可 evr val evr cnt int main 模擬,每產生乙個數就更新這個cnt和evr for i 0 i sizeof d sizeof d 0 i cout 方法...

MapReduce之求平均值

1 map端讀取檔案資訊內容 在讀取檔案資訊內容時,首先對檔案資訊進行切分,將檔案切分為key和value,便於檔案資訊的計算 override protected void map longwritable key,text value,context context throws ioexcep...