好程式設計師大資料培訓分享之hive常見自定義函式

好程式設計師發表於2020-05-26

  好程式設計師大資料培訓分享之 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章