apache datafu分兩部分,本文介紹的是其pig udf的部分。代碼在github上開源(除了代碼外,也有一些slides介紹連結)。
datafu裡面是一些pig的udf,主要包括這些方面的函數:
bags、geo、hash、linkanalysis、random、sampling、sessions、sets、stats、urls
每方面都對應一個package。
我把所有的函數源碼都浏覽了一遍。其實本身對這些udf的使用,官方的文檔上都有介紹,而且源碼的注釋裡也些的很清晰。是以使用本身是很簡單的。
從實作角度看,繼承自pig evalfunc體系。我們知道pig裡的builtin functions裡,有代數函數(avg、count、distinct、top),代數數學函數(max、sum),基本數學函數(sin、cos、tan、floor、log)等等。
datafu實作了一個simpleevalfunc抽象類,繼承自evalfunc,包裝了evalfunc,為簡單的udf簡化了實作過程(省略了一些異常檢查情況,隻需注重處理邏輯)。
通過反射的方式,在exec()方法裡做好參數null檢查,個數檢查,最後把參數傳給子類實作的call()方法,傳回結果。
simpleevalfunc的子類繼承體系如下:
下面那各個package包含的函數功能簡單概況一下。
對bag的基本操作,涉及append、concat、group、left-join、split、count等等
經緯度距離計算
對輸入的string進行md5和sha的轉換
一個pagerank的實作
隻有一個randint,輸入兩個值,輸出兩值之間的一個random值
simplerandomsample和reservoirsample,後者的reservoir是一個priorityqueue,存的是scoredtuple。前後者差別在于無界和有界的sample結果。
按一段time window來group
set之間的差、交、并。
處理的bag内的tuples必須是有序的。
統計相關方法:
計算quantile的兩種方式,一種是流式的。quantile包含了median。
方差。
用于區分user agent來源(電腦還是手機,什麼系統的手機)
全文完 :)