Hive自定義UDF和聚合函式UDAF

2021-09-21 09:00:00 字數 4865 閱讀 3829

hive是一種構建在hadoop上的資料倉儲,hive把sql查詢轉換為一系列在hadoop集群中執行的mapreduce作業,是mapreduce更高層次的抽象,不用編寫具體的mapreduce方法。hive將資料組織為表,這就使得hdfs上的資料有了結構,元資料即表的模式,都儲存在名為metastore的資料庫中。

可以在hive的外殼環境中直接使用dfs訪問hadoop的檔案系統命令。

hive可以允許使用者編寫自己定義的函式udf,來在查詢中使用。hive中有3種udf:

udf:操作單個資料行,產生單個資料行;

udaf:操作多個資料行,產生乙個資料行。

udtf:操作乙個資料行,產生多個資料行乙個表作為輸出。

使用者構建的udf使用過程如下:

第一步:繼承udf或者udaf或者udtf,實現特定的方法。

第二步:將寫好的類打包為jar。如hivefirst.jar.

第三步:進入到hive外殼環境中,利用add jar /home/hadoop/hivefirst.jar.註冊該jar檔案

第四步:為該類起乙個別名,create temporary function mylength as 'com.whut.stringlength';這裡注意udf只是為這個hive會話臨時定義的。

第五步:在select中使用mylength();

自定義udf

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

packagewhut;

importorg.apache.commons.lang.stringutils;

importorg.apache.hadoop.hive.ql.exec.udf;

importorg.apache.hadoop.io.text;

//udf是作用於單個資料行,產生乙個資料行

//使用者必須要繼承udf,且必須至少實現乙個evalute方法,該方法並不在udf中

//但是hive會檢查使用者的udf是否擁有乙個evalute方法

publicclassstripextendsudf

publictext evaluate(text str,string stripchars)

}

注意事項:

1,乙個使用者udf必須繼承org.apache.hadoop.hive.ql.exec.udf;

2,乙個udf必須要包含有evaluate()方法,但是該方法並不存在於udf中。evaluate的引數個數以及型別都是使用者自己定義的。在使用的時候,hive會呼叫udf的evaluate()方法。

自定義udaf

該udaf主要是找到最大值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

packagewhut;

importorg.apache.hadoop.hive.ql.exec.udaf;

importorg.apache.hadoop.hive.ql.exec.udafevaluator;

importorg.apache.hadoop.io.intwritable;

//udaf是輸入多個資料行,產生乙個資料行

//使用者自定義的udaf必須是繼承了udaf,且內部包含多個實現了exec的靜態類

publicclassmaxinumberextendsudaf

//每次對乙個新值進行聚集計算都會呼叫iterate方法

publicbooleaniterate(intwritable value)

//hive需要部分聚集結果的時候會呼叫該方法

//會返回乙個封裝了聚集計算當前狀態的物件

publicintwritable terminatepartial()

//合併兩個部分聚集值會呼叫這個方法

publicbooleanmerge(intwritable other)

//hive需要最終聚集結果時候會呼叫該方法

publicintwritable terminate()

}

}

注意事項:

1,使用者的udaf必須繼承了org.apache.hadoop.hive.ql.exec.udaf;

2,使用者的udaf必須包含至少乙個實現了org.apache.hadoop.hive.ql.exec的靜態類,諸如常見的實現了 udafevaluator。

3,乙個計算函式必須實現的5個方法的具體含義如下:

init():主要是負責初始化計算函式並且重設其內部狀態,一般就是重設其內部字段。一般在靜態類中定義乙個內部欄位來存放最終的結果。

iterate():每一次對乙個新值進行聚集計算時候都會呼叫該方法,計算函式會根據聚集計算結果更新內部狀態。當輸入值合法或者正確計算了,則就返回true。

terminatepartial():hive需要部分聚集結果的時候會呼叫該方法,必須要返回乙個封裝了聚集計算當前狀態的物件。

merge():hive進行合併乙個部分聚集和另乙個部分聚集的時候會呼叫該方法。

terminate():hive最終聚集結果的時候就會呼叫該方法。計算函式需要把狀態作為乙個值返回給使用者。

4,部分聚集結果的資料型別和最終結果的資料型別可以不同。

Hive自定義UDF和聚合函式UDAF

hive是一種構建在hadoop上的資料倉儲,hive把sql查詢轉換為一系列在hadoop集群中執行的mapreduce作業,是mapreduce更高層次的抽象,不用編寫具體的mapreduce方法。hive將資料組織為表,這就使得hdfs上的資料有了結構,元資料即表的模式,都儲存在名為metas...

Hive自定義UDF和聚合函式UDAF

一 hive可以允許使用者編寫自己定義的函式udf,來在查詢中使用。hive中有3種udf udf 操作單個資料行,產生單個資料行 udaf 操作多個資料行,產生乙個資料行。udtf 操作乙個資料行,產生多個資料行乙個表作為輸出。二 編寫自己定義的函式udf 第一步 繼承udf或者udaf或者udt...

hive自定義函式UDF

hive自定義函式 udf 可以幫助使用者輕鬆實現在hql語句中展現自定義查詢結果。這裡以乙個簡單的連線函式來實現使用者自定義函式,假設表結構如下 表中只有兩個簡單的字段,id和name。這裡實現乙個將id和name用 連線的函式,最後輸出結果。第一步 書寫stringjoin類,繼承udf,實現名...