すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:UDF

最終更新日:Jan 11, 2025

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 コードの開発

  1. 統合開発環境 (IDE) を使用して Maven プロジェクトを作成します。
    次のコードは、プロジェクトの基本情報を示しています。ビジネス要件に基づいて groupId パラメーターと artifactId パラメーターを設定できます。
    <groupId>org.example</groupId>
    <artifactId>hiveudf</artifactId>
    <version>1.0-SNAPSHOT</version>
  2. 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>
  3. Hive UDF クラスから継承するクラスを作成します。
    クラス名を指定できます。この例では、クラス名は MyUDF です。
    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";
        }
    }
    // Hello world!
  4. カスタムコードを JAR ファイルにパッケージ化します。
    pom.xml ファイルが格納されているディレクトリで、次のコマンドを実行して JAR ファイルを作成します。
    mvn clean package -DskipTests
    hiveudf-1.0-SNAPSHOT.jar ファイルが target ディレクトリに表示されます。コードの開発は完了です。

UDF の作成と使用

  1. SSH Secure File Transfer Client を使用して、生成された JAR ファイルを E-MapReduce (EMR) クラスターのルートディレクトリにアップロードします。
    この手順を実行する前に、SSH Secure File Transfer Client がコンピューターにインストールされていることを確認してください。
  2. JAR ファイルを Hadoop Distributed File System (HDFS) にアップロードします。
    1. SSH モードでクラスターにログオンします。詳細については、「クラスターへのログオン」をご参照ください。
    2. 次のコマンドを実行して、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
  3. UDF を作成します。
    1. 次のコマンドを実行して、Hive CLI を開きます。
      hive
    2. 次のコマンドを実行して、アップロードされた JAR ファイルに基づいて UDF を作成します。
      create function myfunc as "org.example.MyUDF" using jar "hdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar";

      このコマンドでは、myfunc は UDF の名前、org.example.MyUDFUDF コードの開発 セクションで作成されたクラス、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 が作成されたかどうかを確認することもできます。
  4. 次のコマンドを実行して UDF を使用します。
    組み込み関数を使用するのと同じ方法で UDF を使用するには、コマンドで UDF の名前を指定します。
    select myfunc("abc");
    次の情報が返されます。
    OK
    abc:HelloWorld

参照