以下のチュートリアルを参考に、
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についても、書き方をまとめるかも知れません。。