Hive自定義函數的學習筆記(1)


 

前言:
  hive本身提供了豐富的函數集, 有普通函數(求平方sqrt), 聚合函數(求和sum), 以及表生成函數(explode, json_tuple)等等. 但不是所有的業務需求都能涉及和覆蓋到, 因此hive提供了自定義函數的接口, 方便用戶擴展.
  自己好像很久沒接觸hadoop了, 也很久沒博客了, 今天趁這個短期的項目, 對hive中涉及的自定義函數做個筆記.

准備:
  編寫hive自定義函數前, 需要了解下當前線上hive的版本.

hive --vesion

  比如作者使用到的hive版本為:

$ hive --version
Hive 1.2.1

  具體編寫的自定義函數所依賴的庫最好和線上版本保持一致.
  使用maven組織工程的話, 如下所示:

<dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-exec</artifactId>
  <version>1.2.1</version>
</dependency>

 

編寫代碼:
  Hive中的UDF的設計思路是, 一具體類對應一具體函數.
  以最簡單的大小寫轉換函數為例:

package test.ql;
import org.apache.hadoop.hive.ql.exec.UDF;

public final class LowerUDF extends UDF {

  public String evaluate(String src) {
    if ( src == null ) {
      return "";
    }
    return src.toLowerCase();
  }

}

  注: 繼承於UDF類之后, 編寫具體的evaluate函數即可. 這邊evaluate感覺像基於名字的約定, 有待后續文章的分析和挖掘, ^_^.


jar打包(非主流做法):
  使用maven直接打成jar包(非fat包), 這個非常容易. 因此這邊裝下逼, 使用一回石器時代的打包方式.
  hive的udf函數, 自然依賴於hive相關的jar包.
  在linux環境中:

$ echo $HIVE_HOME
/data/hadoop/hive

  或者使用

$ locate *hive*jar
data/hadoop/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar
/data/hadoop/apache-hive-1.2.1-bin/lib/hive-contrib-1.2.1.jar
/data/hadoop/apache-hive-1.2.1-bin/lib/hive-exec-1.2.1.jar
....
/data/hadoop/apache-hive-1.2.1-bin/lib/udf.jar
....

  都可以獲取到, hive的jar庫地址為/data/hadoop/apache-hive-1.2.1-bin/lib
  編寫編輯腳本:

#! /bin/bash

# 
HIVE_LIB="/data/hadoop/apache-hive-1.2.1-bin/lib/"

# 遍歷hive的jar庫, 放置於classpath中去
cp_libs=.
for jarfile in $(ls ${HIVE_LIB} ); do
  cp_libs=${cp_libs}:${HIVE_LIB}/${jarfile}
done

mkdir -p build

# 編譯
javac -cp ${cp_libs} LowerUDF.java -d build

# 打包
jar cvf lower.jar -C build .

  這樣就可以出一個lower.jar的jar包了.

臨時函數的使用:
  進入hive的交互shell中
  1. 上傳自定義udf的jar
  hive> add jar /path/to/lower.jar
  2. 創建臨時函數
  hive> create temporary function xxoo_lower as 'test.ql.LowerUDF';
  3. 驗證
  hive> select xxoo_lower("Hello World!");
  整個交互流程如下:
  

  不過這個臨時函數, 其生命周期和hive的這個交互session保持一致, 一旦退出, 這個臨時函數就消失了.


永久函數的使用:
  1. 把自定義函數的jar上傳到hdfs中.
  hdfs dfs -put lower.jar 'hdfs:///path/to/hive_func';
  2. 創建永久函數
  hive> create function xxoo_lower as 'test.ql.LowerUDF' using jar 'hdfs:///path/to/hive_func/lower.jar'
  3. 驗證
  hive> select xxoo_lower("Hello World");
  hive> show functions;
  整個交互流程圖如下:

  永久函數的刪除也容易:
  hive> drop function xxoo_lower;

總結:
  就如開頭所講的, 該文章純粹為hive自定函數的學習實戰筆記. 將來有機會, 好好研究一下hive自定義函數的類結構和設計模型, ^_^.

 

個人站點&公眾號:

  個人微信公眾號: 小木的智慧屋

  個人游戲作品集站點(尚在建設中...): www.mmxfgame.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM