Hive函數(shù)
函數(shù)分類
- cli命令
- 顯示當(dāng)前對(duì)話有多少函數(shù)可用 show functions;
- 顯示函數(shù)的表述信息 desc function concat;
- 顯示函數(shù)的擴(kuò)展描述信息 desc function extended concat;
- 簡單函數(shù)
- 特殊函數(shù)
- 窗口函數(shù)
- 應(yīng)用場景
- 用于分區(qū)排序
- 動(dòng)態(tài)Group by
- Top N
- 累計(jì)計(jì)算
- 層次查詢
- Windowing function
- lead
- lag
- FIRST_VALUE
- LAST_VALUE
- 應(yīng)用場景
- 分析函數(shù)
- THE OVER clause
- COUNT
- SUM
- MIN
- MAX
- AVG
- Analytics functions
- RANK
- ROW_NUIMBER
- DENSE_RANK
- CUME_DIST
- PERCENT_RANK
- NTILE
- THE OVER clause
- 混合函數(shù)
- java_method(class,method[,arg1[,arg2...]])
- reflect(class,method[,arg1[,arg2...]])
- hash(a1[,a2])
- UDTF
- 表函數(shù)
- lateralView:LATERAL VIEW udtf(expression) tableAlias AS columnAlias(',',columnAlias)* fromClause:FROM baseTable(lateralView)*
- 例子
- explode函數(shù) :行展開為列
- 表函數(shù)
- 窗口函數(shù)
內(nèi)置函數(shù)
正則表達(dá)式
- 使用正則表達(dá)式的函數(shù)
- A LIKE B莉撇,字符"_"表示任意單個(gè)字符吴叶,而字符"%"表示任意數(shù)量的字符
- A RLIKE B
- select 1 from dual where 'footbar' rlike
^f.*r$
;
- select 1 from dual where 'footbar' rlike
- regexp_replace(string A,string B,string C)
- select regexp_replace('footbar','oo|ar','') from dual;(return 'fb')
- regexp_extract(string subject,string pattern,int index)
- select regexp_extract('foothebar','foo(.*?)(bar)',1) from winfunc;
自定義函數(shù)
UDF
- UDF-用戶自定義函數(shù)(user defined function)
- 針對(duì)單條記錄
- 創(chuàng)建函數(shù)
- 自定義一個(gè)java類
- 繼承UDF類
- 重寫evaluate方法
- 打jar包
- hive執(zhí)行add jar
- add jar /home/jar/function.jar
- hive執(zhí)行創(chuàng)建模板函數(shù)
- create temporary function bigthan as 'com.udf.udftest';
- hql中使用
UDAF
- UDAF用戶自定義聚合函數(shù)
- user defined aggregation function
- 針對(duì)記錄集合
- 開發(fā)通用UDAF有兩個(gè)步驟
- 第一個(gè)是編寫resolver類涮毫,resolver負(fù)責(zé)類型檢查,操作符重載。
- 第二個(gè)是編寫evaluator類,evaluator真正實(shí)現(xiàn)UDAF的邏輯
- 通常來說,頂層UDAF類繼承org.apache.hadoop.hive.ql.udf.GenericUDAFResolver2,里面編寫嵌套類evaluator實(shí)現(xiàn)UDAF的邏輯
- 實(shí)現(xiàn)resolver
- resolver通常繼承org.apache.hadoop.hive.ql.udf.GenericUDAFResolver2逢渔,但是更建議繼承AbstractGenericUDAFResolver,隔離將來hive接口的變化则涯。GenericUDResolver和GenericUDResolver2接口的區(qū)別是复局,后面的允許evaluator實(shí)現(xiàn)可以訪問更多的信息,例如DISTINCT限定符粟判,通配符FUNCTION(*)亿昏。
- 實(shí)現(xiàn)evaluator
- 所有evaluators必須繼承抽象類org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator。子類必須實(shí)現(xiàn)它的一些抽象方法档礁,實(shí)現(xiàn)UDAF的邏輯角钩。
- Mode
- 這個(gè)類比較重要,它表示了udaf在mapreduce的各個(gè)階段,理解Mode的含義递礼,就可以理解了hive的UDAF的運(yùn)行流程
- public static enum Mode{
PARTIAL1惨险,
PARTIAL2,
FINAL脊髓,
COMPLETE
}; - PARTIAL1:這個(gè)是mapreduce的map階段:從原始數(shù)據(jù)到部分?jǐn)?shù)據(jù)聚合辫愉,將會(huì)調(diào)用iterate()和terminatePartial()
- PARTIAL2:這個(gè)是mapreduce的map端的Combiner階段,負(fù)責(zé)在map端合并map的數(shù)據(jù)将硝;從部分?jǐn)?shù)據(jù)聚合到部分?jǐn)?shù)據(jù)聚合恭朗,將會(huì)調(diào)用merge()和terminatePartial()
- FINAL:mapreduce的reduce階段:從部分?jǐn)?shù)據(jù)的聚合到完全聚合,將會(huì)調(diào)用merge()和terminate()
- COMPLETE:如果出現(xiàn)了這個(gè)階段依疼,表示mapreduce只有map痰腮,沒有reduce,所有map端就直接出結(jié)果了律罢;從原始數(shù)據(jù)直接到完全聚合膀值,將會(huì)調(diào)用iterate()和terminate()
- 永久函數(shù)
- 如果希望在hive 中自定義一個(gè)函數(shù),且能永久使用误辑,則修改源碼添加相應(yīng)的函數(shù)類沧踏,然后在修改ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java類,添加相應(yīng)的注冊(cè)函數(shù)代碼巾钉。registerUDF("parse_url",UDFParseUrl.class.false);
- 寫一個(gè)hql文件悦冀,hive -i 'file'
- 新建hiverc文件
- jar包放到安裝目錄下或者指定目錄下
- $HOME/.hiverc
- 把初始化語句加載到文件中