HiveのUDFを作る手順のメモ
以下のチュートリアルを参考に、
HiveのUDFを書いてみたので、作り方のメモを残しておきます。
HivePlugins | cwiki.apache.org
https://cwiki.apache.org/confluence/display/Hive/HivePlugins
UDF, UDAF, UDTFとは
まずはじめに、3種類のUDFについて整理しておきます。
このエントリでは、この中のUDFを作ります。
UDF: User-Defined Function
一般的な関数。入力・返却ともに単一行。
組み込み関数でいうと、round, log, unix_timestamp, regexp_replace など
UDAF: User-Defined Aggregation Function
複数行の入力を集約し一行にして返却する。
組み込み関数でいうと、count, sum, avg など。
group byと一緒に使うことが多い。
UDTF: User-Defined Table Function
一行の入力に対して複数行を返却する。
組み込み関数でいうと、explode, json_tuple など。
lateral viewと一緒に使うことが多い。
次のページに記載されているHiveの組み込み関数を見ると、具体的にイメージできると思います。
Hive Operators and User-Defined Functions (UDFs) | cwiki.apache.org https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
hiveのUDFを作る環境を準備する
それでは、hiveのUDFをビルドする環境を作ります。
前提として、java, gradleはセットアップされているものとします。
以下のように、作業ディレクトリを作ります。
$ mkdir hiveudf-sample
作業ディレクトリ直下に、build.gradleを作ります。
以下のように、依存関係にorg.apache.hiveのjarを指定しておきます。
※groupなどは適宜変更してください。
build.gradle
group 'com.takemikami'
version '1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenCentral()
jcenter()
maven { url 'http://conjars.org/repo' }
}
dependencies {
compile group: 'org.apache.hive', name: 'hive-common', version: '2.0.0'
compile group: 'org.apache.hive', name: 'hive-serde', version: '2.0.0'
compile group: 'org.apache.hive', name: 'hive-exec', version: '2.0.0'
testCompile group: 'junit', name: 'junit', version: '4.11'
}
ソースを格納するディレクトリを作っておきます。
$ mkdir -p src/main/java
まだ何も中身が無いですが、確認のためjarをビルドしてみます。
$ gradle jar
「build/libs/」配下にjarファイルができていることを確認します。
UDFを書いてみる
ここでは、UDFをコーディング&ビルドして実行してみます。
UDFのコーディング
冒頭のチュートリアルと全く同じですが、
以下のように、文字列をlowercaseに変換するUDFを書いてみます。
src/main/java/com/takemikami/udfsample/Lower.java
package com.takemikami.udfsample;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public final class Lower extends UDF {
public Text evaluate(final Text s) {
if (s == null) { return null; }
return new Text(s.toString().toLowerCase());
}
}
UDFを書いたら、gradleでjarをビルドします。
$ gradle jar
HiveからUDFを実行する
hiveコマンドを実行して、hiveを起動します。 以下のようにビルドしたjarファイルをaddして、呼び出してみます。
hive> add jar ※作業ディレクトリのパス※/build/libs/hiveudf-sample-1.0-SNAPSHOT.jar;
hive> create temporary function lower as 'com.takemikami.udfsample.Lower';
hive> select lower('AAA');
OK
aaa
Time taken: 0.651 seconds, Fetched: 1 row(s)
AAA→aaaのように、大文字が小文字に変換されれば想定どおりです。
Text以外の型を使ったUDFを作りたい場合は、
以下のjavadocを参考に実装していけば良いと思います。
Package org.apache.hadoop.io https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/io/package-summary.html
UDAF, UDTFについて
以上の流れで、UDFを作ることができました。
UDAF, UDTFについては、以下にチュートリアルが参考になります。
Hadoop Hive UDAF Tutorial - Extending Hive with Aggregation Functions http://beekeeperdata.com/posts/hadoop/2015/08/17/hive-udaf-tutorial.html
Hadoop Hive UDTF Tutorial - Extending Apache Hive with Table Functions http://beekeeperdata.com/posts/hadoop/2015/07/26/Hive-UDTF-Tutorial.html
余裕があったら、UDAF, UDTFについても、書き方をまとめるかも知れません。。