--- title: "Hive UDF の実行" slug: "hadoop-chadoop-use-ex5" updated: 2026-09-17T09:25:49Z published: 2026-09-17T09:25:49Z canonical: "guide.ncloud-docs.com/hadoop-chadoop-use-ex5" stale: true --- > ## Documentation Index > Fetch the complete documentation index at: https://guide.ncloud-docs.com/llms.txt > Use this file to discover all available pages before exploring further. # Hive UDF の実行 Classic環境で利用できます。 [Hive UDF(User-Defined Functions)](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf)はユーザーが作成したコードをHiveクエリ内で実行できるようサポートし、[Built-in Functions](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inFunctions)だけでは希望するクエリの表現が困難な場合に使用します。 一般に、検索ログ、取引内訳などの特定のフィールドデータに活用するようにUDFを作成して使用します。 関数が受けるInput row、返すOutput row数によって3種類のUDFに区分できます。 各関数の種類ごとに実装するインターフェースが異なります。 - **UDF** Single rowをInputに受けてSingle rowをOutputに返す関数です。 ROUND、REPLACEなどのほとんどのMathematical、String FunctionsがUDFタイプに該当します。 - **UDAF** Multiple rowsをInputに受けてSingle rowをOutputに返す関数です。 COUNT、MAXなどのAggregate Functionsが該当します。 - **UDTF** Single rowsをInputに受けてMultiple rows(テーブル)をOuputに返す関数です。 EXPLODEのような関数が該当します。 このガイドでは、`org.apache.hadoop.hive.ql.exec.UDF` Hive UDFインターフェースを実装してCloud Hadoopで使用する方法を説明します。 Cloud HadoopでHive UDFを使用するには、以下の手順に従います。 - [1. プロジェクトの作成](/docs/ja/hadoop-chadoop-use-ex5#1%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%83%9D%EC%84%B1) - [2. インターフェースの実装](/docs/ja/hadoop-chadoop-use-ex5#2%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EA%B5%AC%ED%98%84) - [3. Hiveを使用する](/docs/ja/hadoop-chadoop-use-ex5#3hive%EC%82%AC%EC%9A%A9) 参考 UDFはJavaで実装する必要があり、他のプログラミング言語を使用するにはuser-definedスクリプト(MapReduceスクリプト)を作成して**SELECT TRANSFORM**構文を使用します。 ## 1. プロジェクトの作成 1. [IntelliJ](https://www.jetbrains.com/ko-kr/idea/)を用いてGradle Projectを作成します。 ![hadoop-chadoop-use-ex5_1-1_ja](https://cdn.document360.io/6998976f-9d95-4df8-b847-d375892b92c2/Images/Documentation/hadoop-chadoop-use-ex5_1-1_ja.png?sv=2026-02-06&spr=https&st=2026-10-26T15%3A27%3A09Z&se=2026-10-26T16%3A27%3A09Z&sr=c&sp=r&sig=wYmXN8wZlMRYzTrZLsHc%2Bo%2B0Rba2johN3rCJZ7mQJz8%3D) ![hadoop-chadoop-use-ex5_1-2_ja](https://cdn.document360.io/6998976f-9d95-4df8-b847-d375892b92c2/Images/Documentation/hadoop-chadoop-use-ex5_1-2_ja.png?sv=2026-02-06&spr=https&st=2026-10-26T15%3A27%3A09Z&se=2026-10-26T16%3A27%3A09Z&sr=c&sp=r&sig=wYmXN8wZlMRYzTrZLsHc%2Bo%2B0Rba2johN3rCJZ7mQJz8%3D) ![hadoop-chadoop-use-ex5_1-3_ja](https://cdn.document360.io/6998976f-9d95-4df8-b847-d375892b92c2/Images/Documentation/hadoop-chadoop-use-ex5_1-3_ja.png?sv=2026-02-06&spr=https&st=2026-10-26T15%3A27%3A09Z&se=2026-10-26T16%3A27%3A09Z&sr=c&sp=r&sig=wYmXN8wZlMRYzTrZLsHc%2Bo%2B0Rba2johN3rCJZ7mQJz8%3D) - package: `com.naverncp.hive` 2. プロジェクトrootの下位の`build.gradle`に以下のようにdependency設定を追加します。 ``` plugins { id 'java' } group 'com.naverncp' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() maven { url "" } } dependencies { compile group: 'org.apache.hadoop', name: 'hadoop-client', version: '2.7.3' compile group: 'org.apache.hive', name: 'hive-exec', version: '1.2.2' compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.9' testCompile group: 'junit', name: 'junit', version: '4.12' } ``` - 例はCloud Hadoop 1.2にインストールされたコンポーネントと同じバージョンを使用しました。 ## 2. インターフェースの実装 1. 以下の条件を満足するUDFを実装します。 - UDFは`org.apache.hadoop.hive.ql.exec.UDF`を継承する。 - UDFは少なくとも一つの`evaluate()`メソッドを実装する。 `org.apache.hadoop.hive.ql.exec.UDF`インターフェースに`evaluate()`メソッドは定義されていないため関数がいくつのargumentを受けるかわからず、argumentがどんなタイプなのか前もって知ることはできません。 ``` // Strip.java package com.naverncp.hive; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; @Description( name = "Strip", value = "returns a stripped text", extended = "stripping characters from the ends of strings" ) public class Strip extends UDF { private Text result = new Text(); public Text evaluate(Text str){ if (str == null){ return null; } result.set(StringUtils.strip(str.toString())); return result; } public Text evaluate(Text str, String stripChar){ if (str == null){ return null; } result.set(StringUtils.strip(str.toString(), stripChar)); return result; } } ``` 上記のクラスでは2つの`evaluate`メソッドを実装しました。 - **1番目のメソッド**:文字列で前後のスペースを除去 - **2番目のメソッド**:文字列の後ろから指定した文字を除去 1. UDFをHiveで使用するには、まずJavaクラスを`.jar`にパッケージングする必要があります。 ``` $ ./gradlew clean $ ./gradlew build $ scp -i ~/Downloads/example-home.pem ~/IdeaProjects/hive/build/libs/hive-1.0-SNAPSHOT.jar sshuser@pub- 4rrsj.hadoop.ntruss.com:~/ $ ssh -i ~/Downloads/example-home.pem sshuser@pub- 4rrsj.hadoop.ntruss.com [sshuser@e-001-example-0917-hd ~]$ hadoop fs -copyFromLocal hive-1.0-SNAPSHOT.jar /user/example/ ``` - 以下の例は、`.jar`を`hdfs:///user/example`の下にアップロードしたものです。 ## 3. Hiveを使用する 1. 以下のコマンドを使用して任意の`hive table`を1つ作成します。 ``` [sshuser@e-001-example-0917-hd ~]$ echo 'dummy' > /tmp/dummy.txt [sshuser@e-001-example-0917-hd ~]$ hive -e "CREATE TABLE dummy (value STRING); \\ LOAD DATA LOCAL INPATH '/tmp/dummy.txt' \\ OVERWRITE INTO TABLE dummy" ``` 2. 以下のコマンドを使用してHive CLIを実行します。 ``` [sshuser@e-001-example-0917-hd ~]$ hive 20/11/06 16:04:39 WARN conf.HiveConf: HiveConf of name hive.server2.enable.doAs.property does not exist log4j:WARN No such property [maxFileSize] in org.apache.log4j.DailyRollingFileAppender. Logging initialized using configuration in file:/etc/hive/2.6.5.0-292/0/hive-log4j.properties hive> ``` - エッジノードにHiveServerがインストールされているため、別途のオプションは不要です。 3. 以下のように`metastore`で関数を登録します。 ``` hive> CREATE FUNCTION strip AS 'com.naverncp.hive.Strip' > USING JAR 'hdfs:///user/example/hive-1.0-SNAPSHOT.jar'; converting to local hdfs:///user/example/hive-1.0-SNAPSHOT.jar Added [/tmp/99c3d137-f58e-4fab-8a2a-98361e3e59a1_resources/hive-1.0-SNAPSHOT.jar] to class path Added resources: [hdfs:///user/example/hive-1.0-SNAPSHOT.jar] OK Time taken: 17.786 seconds ``` または、metastoreに関数を永続的に保存せずにHiveセッション中のみ使用するには、以下のように`TEMPORARY keyword`を使用します。 ``` ADD JAR 'hdfs:///user/example'; CREATE TEMPORARY FUNCTION strip AS 'com.naverncp.hive.Strip' ``` - **CREATE FUNCTION**構文で名前を設定します。 - **Hive Metastore**:テーブルとパーティションに関連したメタ情報を保存する場所 4. ビルドした`strip`関数が正常に実行されるのかを確認します。 空白が除去されたことが確認できます。 ``` hive> select strip(' bee ') from dummy; converting to local hdfs:///user/example/hive-1.0-SNAPSHOT.jar Added [/tmp/70e2e17a-ecca-41ff-9fe6-48417b8ef797_resources/hive-1.0-SNAPSHOT.jar] to class path Added resources: [hdfs:///user/example/hive-1.0-SNAPSHOT.jar] OK bee Time taken: 0.967 seconds, Fetched: 1 row(s) hive> select strip('banana', 'ab') from dummy ; OK nan Time taken: 0.173 seconds, Fetched: 1 row(s) ``` 関数の削除は、以下のように実行できます。 ``` DROP FUNCTION strip ``` 参考 データの特性に応じてよく使うロジックをUDFに作成しておくと、SQL構文で簡単にデータを照会できます。