--- title: "Hive UDFを実行" slug: "hadoop-vpc-use-ex5" tags: ["Cloud Hadoop", "vpc"] updated: 2026-09-17T09:25:51Z published: 2026-09-17T09:25:51Z canonical: "guide.ncloud-docs.com/hadoop-vpc-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を実行 VPC環境で利用できます。 [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(table)を Outputで返す関数です。 EXPLODEのような関数が該当します。 本ガイドでは、`org.apache.hadoop.hive.ql.exec.UDF` Hive UDFインターフェースを実装して Cloud Hadoopで使用する方法を説明します。 Cloud Hadoopで Hive UDFを使用するには、次の手順を順に実行します。 - [1.プロジェクト作成](/docs/ja/hadoop-vpc-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-vpc-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-vpc-use-ex5#3-hive-%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_ko](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-26T14%3A33%3A58Z&se=2026-10-26T15%3A33%3A58Z&sr=c&sp=r&sig=JDMfnj4zvrSXmllxKMZrWSYQkSmkfEC8jJzXZgyqyuA%3D) ![hadoop-chadoop-use-ex5_1-2_ko](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-26T14%3A33%3A58Z&se=2026-10-26T15%3A33%3A58Z&sr=c&sp=r&sig=JDMfnj4zvrSXmllxKMZrWSYQkSmkfEC8jJzXZgyqyuA%3D) ![hadoop-chadoop-use-ex5_1-3_ko](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-26T14%3A33%3A58Z&se=2026-10-26T15%3A33%3A58Z&sr=c&sp=r&sig=JDMfnj4zvrSXmllxKMZrWSYQkSmkfEC8jJzXZgyqyuA%3D) - package: `com.naverncp.hive` 2. プロジェクト root以下の`build.gradle`に、以下のように dependency設定を追加します。 ``` plugins { id 'java' } group 'com.naverncp' version '1.0-SNAPSHOT' repositories { mavenCentral() maven { url "" } } dependencies { compile group: 'org.apache.hadoop', name: 'hadoop-client', version: '3.1.1' compile group: 'org.apache.hive', name: 'hive-exec', version: '3.1.2' compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.9' testCompile group: 'junit', name: 'junit', version: '4.12' } ``` - 例では、Cloud Hadoop 2.0にインストールされたコンポーネントと同じバージョンを使用しました。 ## 2.インターフェース実装 1. 次の条件を満たす UDFを実装します。 - UDFは`org.apache.hadoop.hive.ql.exec.UDF`を継承する。 - UDFは少なくとも1つの`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 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がインストールされているため、別のオプションを設定する必要はありません。 2. 以下のように`Metastore`で関数を登録します。 ``` hive> CREATE FUNCTION strip AS 'com.naverncp.hive.Strip' > USING JAR 'hdfs:///user/[管理者アカウント名]hive-1.0-SNAPSHOT.jar'; converting to local hdfs:///user/[管理者アカウント名]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/[管理者アカウント名]/hive-1.0-SNAPSHOT.jar] OK Time taken: 17.786 seconds ``` また、Metastoreに関数を永続的に保存せずに Hiveセッション中のみ使用するには、以下のように`TEMPORARY keyword`を使用します。 ``` ADD JAR 'hdfs:///user/[管理者アカウント名]'; CREATE TEMPORARY FUNCTION strip AS 'com.naverncp.hive.Strip' ``` - CREATE FUNCTION構文で名前を設定します。 - Hive Metastore: テーブルとパーティションに関連するメタ情報を保存する場所 3. ビルドした`strip`関数が正しく実行されることを確認します。空白が除去されたことを確認できます。 ``` hive> SELECT strip(' bee '); converting to local hdfs:///user/[管理者アカウント名]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/[管理者アカウント名]/hive-1.0-SNAPSHOT.jar] OK bee Time taken: 0.967 seconds, Fetched: 1 row(s) hive> SELECT strip('banana', 'ab'); OK nan Time taken: 0.173 seconds, Fetched: 1 row(s) ``` 関数の削除は以下のように実行できます。 ``` DROP FUNCTION strip; ``` 参考 データの特性に応じてよく使用するロジックを UDFで作成しておくと、SQL構文で簡単にデータを照会できます。