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
package
whut;
import
org.apache.commons.lang.stringutils;
import
org.apache.hadoop.hive.ql.exec.udf;
import
org.apache.hadoop.io.text;
//udf是作用於單個資料行,產生乙個資料行
//使用者必須要繼承udf,且必須至少實現乙個evalute方法,該方法並不在udf中
//但是hive會檢查使用者的udf是否擁有乙個evalute方法
public
class
strip
extends
udf
public
text 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
package
whut;
import
org.apache.hadoop.hive.ql.exec.udaf;
import
org.apache.hadoop.hive.ql.exec.udafevaluator;
import
org.apache.hadoop.io.intwritable;
//udaf是輸入多個資料行,產生乙個資料行
//使用者自定義的udaf必須是繼承了udaf,且內部包含多個實現了exec的靜態類
public
class
maxinumber
extends
udaf
//每次對乙個新值進行聚集計算都會呼叫iterate方法
public
boolean
iterate(intwritable value)
//hive需要部分聚集結果的時候會呼叫該方法
//會返回乙個封裝了聚集計算當前狀態的物件
public
intwritable terminatepartial()
//合併兩個部分聚集值會呼叫這個方法
public
boolean
merge(intwritable other)
//hive需要最終聚集結果時候會呼叫該方法
public
intwritable 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,實現名...