Hive は多くの組み込み関数を備えています。組み込み関数が計算要件を満たせない場合は、ユーザー定義関数 (UDF) を作成できます。 UDF は、一般的な組み込み関数と同様の方法で使用できます。このトピックでは、UDF を開発および使用する方法について説明します。
背景情報
次の表に、UDF の種類を示します。
UDF の種類 | 説明 |
ユーザー定義スカラー関数 (UDF) | UDF の入力と出力は 1 対 1 のマッピングです。 UDF が呼び出されるたびに、1 行のデータを読み取り、1 つのデータ値を返します。 |
ユーザー定義テーブル値関数 (UDTF) | UDTF が呼び出されるたびに、複数の行のデータを返します。すべての種類の UDF の中で、複数のフィールドを返すことができるのは UDTF のみです。 |
ユーザー定義集計関数 (UDAF) | UDAF の入力と出力は多対 1 のマッピングです。 UDAF が呼び出されるたびに、複数の入力レコードを集計して 1 つの出力値にします。 SQL ステートメントの GROUP BY 句で UDAF を使用できます。 |
UDF コードの開発
- 統合開発環境 (IDE) を使用して Maven プロジェクトを作成します。次のコードは、プロジェクトの基本情報を示しています。ビジネス要件に基づいて groupId パラメーターと artifactId パラメーターを設定できます。
<groupId>org.example</groupId> <artifactId>hiveudf</artifactId> <version>1.0-SNAPSHOT</version>
- pom.xml ファイルに次の依存関係を追加します。
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>2.3.7</version> <exclusions> <exclusion> <groupId>org.pentaho</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
- Hive UDF クラスから継承するクラスを作成します。クラス名を指定できます。この例では、クラス名は MyUDF です。
// Hello world!package org.example; import org.apache.hadoop.hive.ql.exec.UDF; /** * Hello world! * */ public class MyUDF extends UDF { public String evaluate(final String s) { if (s == null) { return null; } return s + ":HelloWorld"; } }
- カスタムコードを JAR ファイルにパッケージ化します。pom.xml ファイルが格納されているディレクトリで、次のコマンドを実行して JAR ファイルを作成します。
mvn clean package -DskipTests
hiveudf-1.0-SNAPSHOT.jar ファイルが target ディレクトリに表示されます。コードの開発は完了です。
UDF の作成と使用
- SSH Secure File Transfer Client を使用して、生成された JAR ファイルを E-MapReduce (EMR) クラスターのルートディレクトリにアップロードします。この手順を実行する前に、SSH Secure File Transfer Client がコンピューターにインストールされていることを確認してください。
- JAR ファイルを Hadoop Distributed File System (HDFS) にアップロードします。
- SSH モードでクラスターにログオンします。詳細については、「クラスターへのログオン」をご参照ください。
- 次のコマンドを実行して、JAR ファイルを HDFS にアップロードします。
hadoop fs -put hiveudf-1.0-SNAPSHOT.jar /user/hive/warehouse/
hadoop fs -ls /user/hive/warehouse/
コマンドを実行して、アップロードが成功したかどうかを確認できます。次の情報が返された場合、アップロードは成功です。Found 1 items -rw-r--r-- 1 xx xx 2668 2021-06-09 14:13 /user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar
- UDF を作成します。
- 次のコマンドを実行して、Hive CLI を開きます。
hive
- 次のコマンドを実行して、アップロードされた JAR ファイルに基づいて UDF を作成します。
create function myfunc as "org.example.MyUDF" using jar "hdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar";
このコマンドでは、
myfunc
は UDF の名前、org.example.MyUDF
はUDF コードの開発 セクションで作成されたクラス、hdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar
は JAR ファイルがアップロードされる HDFS パスです。次の情報が返された場合、UDF は作成されます。Added [/private/var/folders/2s/wzzsgpn13rn8rl_0fc4xxkc00000gp/T/40608d4a-a0e1-4bf5-92e8-b875fa6a1e53_resources/hiveudf-1.0-SNAPSHOT.jar] to class path Added resources: [hdfs:///user/hive/warehouse/myfunc/hiveudf-1.0-SNAPSHOT.jar]
説明SHOW FUNCTIONS LIKE '*myfunc*'
コマンドを実行して、UDF が作成されたかどうかを確認することもできます。
- 次のコマンドを実行して、Hive CLI を開きます。
- 次のコマンドを実行して UDF を使用します。組み込み関数を使用するのと同じ方法で UDF を使用するには、コマンドで UDF の名前を指定します。
select myfunc("abc");
次の情報が返されます。OK abc:HelloWorld