Hive函數
函數分類
- cli命令
- 顯示當前對話有多少函數可用 show functions;
- 顯示函數的表述信息 desc function concat;
- 顯示函數的擴展描述信息 desc function extended concat;
- 簡單函數
- 特殊函數
- 窗口函數
- 應用場景
- 用于分區排序
- 動態Group by
- Top N
- 累計計算
- 層次查詢
- Windowing function
- lead
- lag
- FIRST_VALUE
- LAST_VALUE
- 應用場景
- 分析函數
- THE OVER clause
- COUNT
- SUM
- MIN
- MAX
- AVG
- Analytics functions
- RANK
- ROW_NUIMBER
- DENSE_RANK
- CUME_DIST
- PERCENT_RANK
- NTILE
- THE OVER clause
- 混合函數
- java_method(class,method[,arg1[,arg2...]])
- reflect(class,method[,arg1[,arg2...]])
- hash(a1[,a2])
- UDTF
- 表函數
- lateralView:LATERAL VIEW udtf(expression) tableAlias AS columnAlias(',',columnAlias)* fromClause:FROM baseTable(lateralView)*
- 例子
- explode函數 :行展開為列
- 表函數
- 窗口函數
內置函數
正則表達式
- 使用正則表達式的函數
- A LIKE B,字符"_"表示任意單個字符,而字符"%"表示任意數量的字符
- 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;
自定義函數
UDF
- UDF-用戶自定義函數(user defined function)
- 針對單條記錄
- 創建函數
- 自定義一個java類
- 繼承UDF類
- 重寫evaluate方法
- 打jar包
- hive執行add jar
- add jar /home/jar/function.jar
- hive執行創建模板函數
- create temporary function bigthan as 'com.udf.udftest';
- hql中使用
UDAF
- UDAF用戶自定義聚合函數
- user defined aggregation function
- 針對記錄集合
- 開發通用UDAF有兩個步驟
- 第一個是編寫resolver類,resolver負責類型檢查,操作符重載。
- 第二個是編寫evaluator類,evaluator真正實現UDAF的邏輯
- 通常來說,頂層UDAF類繼承org.apache.hadoop.hive.ql.udf.GenericUDAFResolver2,里面編寫嵌套類evaluator實現UDAF的邏輯
- 實現resolver
- resolver通常繼承org.apache.hadoop.hive.ql.udf.GenericUDAFResolver2,但是更建議繼承AbstractGenericUDAFResolver,隔離將來hive接口的變化。GenericUDResolver和GenericUDResolver2接口的區別是,后面的允許evaluator實現可以訪問更多的信息,例如DISTINCT限定符,通配符FUNCTION(*)。
- 實現evaluator
- 所有evaluators必須繼承抽象類org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator。子類必須實現它的一些抽象方法,實現UDAF的邏輯。
- Mode
- 這個類比較重要,它表示了udaf在mapreduce的各個階段,理解Mode的含義,就可以理解了hive的UDAF的運行流程
- public static enum Mode{
PARTIAL1,
PARTIAL2,
FINAL,
COMPLETE
}; - PARTIAL1:這個是mapreduce的map階段:從原始數據到部分數據聚合,將會調用iterate()和terminatePartial()
- PARTIAL2:這個是mapreduce的map端的Combiner階段,負責在map端合并map的數據;從部分數據聚合到部分數據聚合,將會調用merge()和terminatePartial()
- FINAL:mapreduce的reduce階段:從部分數據的聚合到完全聚合,將會調用merge()和terminate()
- COMPLETE:如果出現了這個階段,表示mapreduce只有map,沒有reduce,所有map端就直接出結果了;從原始數據直接到完全聚合,將會調用iterate()和terminate()
- 永久函數
- 如果希望在hive 中自定義一個函數,且能永久使用,則修改源碼添加相應的函數類,然后在修改ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java類,添加相應的注冊函數代碼。registerUDF("parse_url",UDFParseUrl.class.false);
- 寫一個hql文件,hive -i 'file'
- 新建hiverc文件
- jar包放到安裝目錄下或者指定目錄下
- $HOME/.hiverc
- 把初始化語句加載到文件中