Hive的UDF概念
首先我們學習hadoop的時候,為了讓我們不太會java語言但是對SQL很熟悉的工程師能夠操作基本的mapreduce計算過程,Hive被設計出來了。Hive就好比是hadoop在執行MR(mapreduce)程序的一個操作系統,因為我們可以用簡單的SQL語句去代替復雜的MR程序,因為Hive可以將我們的SQL語句轉化為MR程序然后去執行。Hive的語法和SQL的語法很多地方是相同的,所以說它就是為熟連使用SQL的工程師設計的。
首先什么是UDF,UDF的全稱為user-defined function,用戶定義函數,為什么有它的存在呢?有的時候 你要寫的查詢無法輕松地使用Hive提供的內置函數來表示,通過寫UDF,Hive就可以方便地插入用戶寫的處理代碼并在查詢中使用它們,相當于在HQL(Hive SQL)中自定義一些函數。
首先UDF必須用java語言編寫,Hive本身就是用java寫的。所以想學好hadoop這個分布式框架的相關技術,熟練使用java就是基本功了!
Hive中有三種UDF:(普通)UDF、用戶定義聚集函數(user-defined aggregate function,UDAF)、用戶定義表生成函數(user-defined table-generating function,UDTF)。
UDF操作作用于單個數據行,并且產生一個數據行作為輸出。大多數函數都屬于這一類(比如數學函數和字符串函數)。
UDAF 接受多個輸入數據行,并產生一個輸出數據行。想COUNT和MAX這樣的函數就是聚集函數。
UDTF 操作作用于單個數據行,并且產生多個數據行-------一個表作為輸出
首先一個UDF必須滿足下面兩個條件:
1 一個UDF必須是org.apache.hadoop.hive.ql.exec.UDF的子類(換句話說就是我們一般都是去繼承這個類)
2 一個UDF必須至少實現了evaluate()方法
注意UDF名不是大小寫敏感的
一個UDAF計算函數必須實現下面的5個方法:
1 init()方法 init()方法負責初始化計算函數并重設它的內部狀態。在MaximumIntUDAFEvaluator中,我們把存放最終結果的IntWritable對象設置為null。我們使用null來表示目前還沒有對任何值進行聚集計算,這和對空集NULL計算最大值應有的結果是一致的。
2 iterate()方法 每次對一個新值進行聚集計算時都會調用iterate()方法。計算函數要根據聚集計算的結果更新其內部狀態。iterate()接受的參數和Hive中被調用函數的參數使對應的。
3 terminatePartial()方法 Hive需要部分聚集結果時會調用terminatePartial()方法。這個方法必須返回一個封裝了聚集計算當前狀態的對象。
4 merge()方法 在Hive決定要合并一個部分聚集值和另一個部分聚集值時會調用merge()方法。該方法接受一個對象作為輸入。這個對象的類型必須和terminatePartial()方法返回的類型一致。
5 terminate() Hive需要最終聚集結果時會調用terminate()方法。計算函數需要把狀態作為一個值返回。
具體去寫UDF的過程我這里就不具體說了,我來說說,怎樣去把我們寫好的UDF放到Hive中去使用:
首先我們將用java寫好的UDF函數編譯后的Java類打包成為一個JAR文件,并在Hive中注冊這個文件(相當于告訴Hive這個是我寫的UDF):
轉載”https://blog.csdn.net/yqlakers/article/details/70211522
總結
以上是生活随笔為你收集整理的Hive的UDF概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【待解答】文件目录可以利用foreach
- 下一篇: 【转载保存】java牛逼的开源项目汇总