生活随笔
收集整理的這篇文章主要介紹了
Hive自定义UDF和聚合函数UDAF
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
轉自:http://computerdragon.blog.51cto.com/6235984/1288567
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
?
[java] view plain copy
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{??????private?Text?result=new?Text();??????//自定義方法??????public?Text?evaluate(Text?str)??????{????????if(str==null)??????????return?null;??????????result.set(StringUtils.strip(str.toString()));??????????return?result;??????}??????public?Text?evaluate(Text?str,String?stripChars)??????{??????????if(str==null)??????????????return?null;??????????result.set(StringUtils.strip(str.toString(),stripChars));??????????return?result;??????}??}??注意事項:
? ?1,一個用戶UDF必須繼承org.apache.hadoop.hive.ql.exec.UDF;
? ?2,一個UDF必須要包含有evaluate()方法,但是該方法并不存在于UDF中。evaluate的參數個數以及類型都是用戶自己定義的。在使用的時候,Hive會調用UDF的evaluate()方法。
自定義UDAF
該UDAF主要是找到最大值
[java] view plain copy
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{??????public?static?class?MaxiNumberIntUDAFEvaluator?implements?UDAFEvaluator{??????????//最終結果??????????private?IntWritable?result;??????????//負責初始化計算函數并設置它的內部狀態,result是存放最終結果的??????????@Override??????????public?void?init()?{??????????????result=null;??????????}??????????//每次對一個新值進行聚集計算都會調用iterate方法??????????public?boolean?iterate(IntWritable?value)??????????{??????????????if(value==null)??????????????????return?false;??????????????if(result==null)????????????????result=new?IntWritable(value.get());??????????????else????????????????result.set(Math.max(result.get(),?value.get()));??????????????return?true;??????????}??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????//Hive需要部分聚集結果的時候會調用該方法??????????//會返回一個封裝了聚集計算當前狀態的對象??????????public?IntWritable?terminatePartial()??????????{??????????????return?result;??????????}??????????//合并兩個部分聚集值會調用這個方法??????????public?boolean?merge(IntWritable?other)??????????{??????????????return?iterate(other);??????????}??????????//Hive需要最終聚集結果時候會調用該方法??????????public?IntWritable?terminate()??????????{??????????????return?result;??????????}??????}??}??注意事項:
? ? 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,部分聚集結果的數據類型和最終結果的數據類型可以不同。
轉載于:https://my.oschina.net/newchaos/blog/1596663
總結
以上是生活随笔為你收集整理的Hive自定义UDF和聚合函数UDAF的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。