好程式設計師大資料培訓分享之hive常見自定義函式
好程式設計師大資料培訓分享之 hive 常見自定義函式 先來講一下 hive 自定義函式
1.1 為什麼需要自定義函式
hive的內建函式滿足不了所有的業務需求 。 hive提供很多的模組可以自定義功能 ,比如:自定義函式、 serde 、輸入輸出格式等。
1.2 常見自定義函式有哪些
00001. UDF :使用者自定義函式,user defined function。一對一的輸入輸出。(最常用的)。
00002. UDTF :使用者自定義表生成函式。user defined table-generate function.一對多的輸入輸出。lateral view explode
00003. UDAF :使用者自定義聚合函式。user defined aggregate function。多對一的輸入輸出 count sum max。
2 自定義函式實現
2.1 UDF格式
先在工程下新建一個pom.xml,加入以下maven的依賴包 請檢視 code/pom.xml
定義UDF函式要注意下面幾點:
00001. 繼承 org.apache.hadoop.hive.ql.exec.UDF
00002. 重寫 evaluate (),這個方法不是由介面定義的,因為它可接受的引數的個數,資料型別都是不確定的。Hive會檢查UDF,看能否找到和函式呼叫相匹配的evaluate()方法
2.1.1 自定義函式第一個案例
public class FirstUDF extends UDF {
public String evaluate ( String str ){
String upper = null;
//1、檢查輸入引數 if ( StringUtils . isEmpty ( str )){
} else {
upper = str . toUpperCase ();
}
return upper ;
}
//除錯自定義函式 public static void main ( String [] args ){
System . out . println (new firstUDF (). evaluate ( "jiajingwen" ));
}}
2.2 函式載入方式
2.2.1 命令載入
這種載入只對本session有效
# 1、將編寫的udf的jar包上傳到伺服器上,並且將jar包新增到hive的class path中
# 進入到hive客戶端,執行下面命令
add jar /hivedata/udf.jar
# 2、建立一個臨時函式名,要跟上面hive在同一個session裡面:
create temporary function toUP as 'com.qf.hive.FirstUDF';
3、檢查函式是否建立成功
show functions;
4. 測試功能
select toUp('abcdef');
5. 刪除函式
drop temporary function if exists tolow;
2.2.2 啟動引數載入
(也是在本session有效,臨時函式)
1、將編寫的udf的jar包上傳到伺服器上
2、建立配置檔案
vi ./hive-init
add jar /hivedata/udf.jar;
create temporary function toup as 'com.qf.hive.FirstUDF';
# 3、啟動hive的時候帶上初始化檔案:
hive -i ./hive-init
select toup('abcdef')
2.2.3 配置檔案載入
透過配置檔案方式這種只要用hive命令列啟動都會載入函式
1、將編寫的udf的jar包上傳到伺服器上
2、在hive的安裝目錄的bin目錄下建立一個配置檔案,檔名:.hiverc
vi ./bin/.hiverc
add jar /hivedata/udf.jar;
create temporary function toup as 'com.qf.hive.FirstUDF';
3、啟動hive
hive
2.3 UDTF格式
UDTF是一對多的輸入輸出,實現UDTF需要完成下面步驟
00001. 繼承 org.apache.hadoop.hive.ql.udf.generic.GenericUDF ,
00002. 重寫initlizer()、getdisplay()、evaluate()。
執行流程如下:
UDTF首先會呼叫initialize方法,此方法返回UDTF的返回行的資訊(返回個數,型別)。
初始化完成後,會呼叫process方法,真正的處理過程在process函式中,在process中,每一次forward()呼叫產生一行;如果產生多列可以將多個列的值放在一個陣列中,然後將該陣列傳入到forward()函式。
最後close()方法呼叫,對需要清理的方法進行清理。
2.3.1 需求:
把"k1:v1;k2:v2;k3:v3"類似的的字串解析成每一行多行,每一行按照key:value格式輸出
2.3.2 原始碼
自定義函式如下:
package com.qf.hive ;
public class ParseMapUDTF extends GenericUDTF {
@Override
public void close () throws HiveException {
}
@Override
public StructObjectInspector initialize ( ObjectInspector [] args )
throws UDFArgumentException {
if ( args . length != 1 ) {
throw new UDFArgumentLengthException ( " 只能傳入一個引數" );
}
ArrayList < String > fieldNameList = new ArrayList < String >();
ArrayList < ObjectInspector > fieldOIs = new ArrayList < ObjectInspector >();
fieldNameList . add ( "map" );
fieldOIs . add ( PrimitiveObjectInspectorFactory . javaStringObjectInspector );
fieldNameList . add ( "key" );
fieldOIs . add ( PrimitiveObjectInspectorFactory . javaStringObjectInspector );
return ObjectInspectorFactory . getStandardStructObjectInspector ( fieldNameList , fieldOIs );
}
@Override
public void process ( Object [] args ) throws HiveException {
String input = args [ 0 ]. toString ();
String [] paramString = input . split ( ";" );
for( int i = 0 ; i < paramString . length ; i ++) {
try {
String [] result = paramString [ i ]. split ( ":" );
forward ( result );
} catch ( Exception e ) {
continue;
}
}
}
}
2.3.3 打包載入
對上述命令原始檔打包為udf.jar,複製到伺服器的/hivedata/目錄
在Hive客戶端把udf.jar加入到hive中,如下:
add jar /hivedata/udf.jar;
2.3.4 建立臨時函式:
在Hive客戶端建立函式:
create temporary function parseMap as 'com.qf.hive.ParseMapUDTF' ; # 建立一個臨時函式parseMap # 檢視函式是否加入 show functions ;
2.3.5 測試臨時函式
select parseMap ( "name:zhang;age:30;address:shenzhen" )
結果如下:
#map key
name zhang
age 30
address shenzhen
2.4 UDAF格式
使用者自定義聚合函式。user defined aggregate function。多對一的輸入輸出 count sum max。定義一個UDAF需要如下步驟:
00001. UDF自定義函式必須是org.apache.hadoop.hive.ql.exec.UDAF的子類,並且包含一個火哥多個巢狀的的實現了org.apache.hadoop.hive.ql.exec.UDAFEvaluator的靜態類。
00002. 函式類需要繼承UDAF類,內部類Evaluator實UDAFEvaluator介面。
00003. Evaluator需要實現 init、iterate、terminatePartial、merge、terminate這幾個函
這幾個函式作用如下:
函式說明 init實現介面UDAFEvaluator的init函式iterate每次對一個新值進行聚集計算都會呼叫,計算函式要根據計算的結果更新其內部狀態terminatePartial無引數,其為iterate函式輪轉結束後,返回輪轉資料merge接收terminatePartial的返回結果,進行資料merge操作,其返回型別為boolean。terminate返回最終的聚集函式結果。
2.4.1 需求
計算一組整數的最大值
2.4.2 程式碼
package com.qf.hive ; public class MaxValueUDAF extends UDAF {
public static class MaximumIntUDAFEvaluator implements UDAFEvaluator {
private IntWritable result ;
public void init () {
result = null;
}
public boolean iterate ( IntWritable value ) {
if ( value == null) {
return true;
}
if ( result == null) {
result = new IntWritable ( value . get () );
} else {
result . set ( Math . max ( result . get (), value . get () ) );
}
return true;
}
public IntWritable terminatePartial () {
return result ;
}
public boolean merge ( IntWritable other ) {
return iterate ( other );
}
public IntWritable terminate () {
return result ;
}
}}
2.4.3 打包載入
對上述命令原始檔打包為udf.jar,複製到伺服器的/hivedata/目錄
在Hive客戶端把udf.jar加入到hive中,如下:
add jar /hivedata/udf.jar;
2.4.4 建立臨時函式:
在Hive客戶端建立函式:
create temporary function maxInt as 'com.qf.hive.MaxValueUDAF' ; # 檢視函式是否加入 show functions ;
2.3.5 測試臨時函式
select maxInt (mgr) from emp
結果如下:
#結果
7902
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2694352/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師大資料培訓分享之hive常用內部函式程式設計師大資料Hive函式
- 好程式設計師大資料培訓分享之hive儲存過程程式設計師大資料Hive儲存過程
- 好程式設計師大資料培訓分享之《MySQL資料庫》常用函式整理程式設計師大資料MySql資料庫函式
- 好程式設計師大資料培訓之Hadoop常見問題程式設計師大資料Hadoop
- 好程式設計師大資料培訓分享spark之Scala程式設計師大資料Spark
- 好程式設計師大資料培訓分享如何區分Hive與HBase程式設計師大資料Hive
- 好程式設計師大資料培訓分享Hive基礎知識講解程式設計師大資料Hive
- 好程式設計師大資料培訓分享常見的Hadoop和Spark專案程式設計師大資料HadoopSpark
- 好程式設計師大資料培訓分享MapReduce理解程式設計師大資料
- 好程式設計師大資料培訓分享HDFS讀流程程式設計師大資料
- 好程式設計師大資料培訓簡述Hadoop常見問題程式設計師大資料Hadoop
- 好程式設計師大資料培訓分享大資料還學嗎?程式設計師大資料
- 好程式設計師大資料培訓分享大資料的應用程式設計師大資料
- 好程式設計師大資料培訓分享Hadoop分散式叢集程式設計師大資料Hadoop分散式
- 好程式設計師Python培訓分享函數語言程式設計之匿名函式程式設計師Python函數函式
- 好程式設計師大資料培訓分享mysql資料型別程式設計師大資料MySql資料型別
- 好程式設計師大資料培訓分享之Ambari和ClouderaManager對比程式設計師大資料Cloud
- 好程式設計師大資料培訓分享之MySQL資料庫SQL簡介程式設計師大資料MySql資料庫
- 好程式設計師Python培訓分享函式的定義與使用示例程式設計師Python函式
- 好程式設計師大資料培訓分享大資料面試寶典一程式設計師大資料面試
- 好程式設計師大資料培訓分享大資料面試寶典二程式設計師大資料面試
- 好程式設計師大資料培訓分享大資料面試寶典三程式設計師大資料面試
- 好程式設計師大資料培訓分享大資料面試寶典四程式設計師大資料面試
- 好程式設計師大資料培訓分享大資料面試寶典六程式設計師大資料面試
- 好程式設計師大資料培訓分享大資料的影響一程式設計師大資料
- 好程式設計師大資料培訓分享大資料兩大核心技術程式設計師大資料
- 好程式設計師Java培訓分享Java效能常見命令有哪些程式設計師Java
- 好程式設計師大資料培訓分享大資料就業方向有哪些?程式設計師大資料就業
- 好程式設計師大資料培訓分享:Hadoop叢集同步程式設計師大資料Hadoop
- 好程式設計師大資料培訓分享Spark技術總結程式設計師大資料Spark
- 好程式設計師大資料培訓分享MySQL8.0新特性程式設計師大資料MySql
- 好程式設計師大資料培訓分享Hive的靜態分割槽與動態分割槽程式設計師大資料Hive
- 好程式設計師大資料培訓分享settings和mapping的意義程式設計師大資料APP
- 好程式設計師Java培訓分享Java函式式編碼結構程式設計師Java函式
- 好程式設計師Java培訓分享Java常見排序演算法之插入排序程式設計師Java排序演算法
- 好程式設計師Python培訓分享簡述fetchone()函式程式設計師Python函式
- 好程式設計師大資料培訓分享HBase Filter過濾器概述程式設計師大資料Filter過濾器
- 好程式設計師大資料培訓分享Hadoop入門進階程式設計師大資料Hadoop