Hive UDF の実行
    • PDF

    Hive UDF の実行

    • PDF

    Article Summary

    VPC環境で利用できます。

    Hive UDF (User-Defined Functions) は、ユーザーが作成したコードを Hive クエリ内で実行できるようにし、Built- in Functionsだけでは、目的のクエリを表現するのが難しい場合に使用します。
    通常、検索ログ、取引履歴など、特定のフィールドデータに利用できるようにUDFを作成して使用します。
    Functionが受けるInput row、返すOutput row数によって3種類のUDFに区分できます。各関数の種類ごとに実装するインターフェースが異なります。

    • UDF
      Single rowをInputに受けてSingle rowをOutputに返す関数です。
      ROUND、REPLACEなどのほとんどのMathematical、String Functionsがこのタイプに該当します。

    • UDAF
      Multiple rowsをInputに受けてSingle rowをOutputに返す関数です。
      COUNT、MAXなどのAggregate functionsが該当します。

    • UDTF
      Single rowをInputに受けてMultiple rows(テーブル)をOutputに返す関数です。
      EXPLODEのような関数が該当します。

    このガイドでは、org.apache.hadoop.hive.ql.exec.UDF Hive UDFインターフェースを実装してCloud Hadoopで使用する方法を説明します。

    Cloud HadoopでHive UDFを使用するには、以下の手順に従います。

    参考

    UDFはJavaで実装する必要があり、他のプログラミング言語を使用するにはuser-defined script(MapReduce script)を作成してSELECT TRANSFORM構文を使用してください。

    1. プロジェクトの作成

    1. IntelliJを用いてGradle Projectを作成します。

      • package: com.naverncp.hive

      hadoop-chadoop-use-ex5_1-1_ja

      hadoop-chadoop-use-ex5_1-2_ja

      hadoop-chadoop-use-ex5_1-3_ja

    2. プロジェクトrootの下位のbuild.gradleに以下のようにdependency設定を追加します。

      • 例はCloud Hadoop 2.0にインストールされたコンポーネントと同じバージョンを使用しました。
      plugins {
          id 'java'
      }
      group 'com.naverncp'
      version '1.0-SNAPSHOT'
      repositories {
          mavenCentral()
          maven {
              url "<http://conjars.org/repo>"
          }
      }
      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'
      }
      

    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にパッケージングする必要があります。

      • 以下の例は、.jarhdfs:///user/exampleの下にアップロードしたものです。
      $ ./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/
      

    3. Hiveを使用する

    1. 以下のコマンドを使用してHive CLIを実行します。

      • edgeノードにHiveServerがインストールされているため、別途のオプションは不要です。
      [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>
      
    2. 以下のようにMetastoreで関数を登録します。

      • CREATE FUNCTION構文で名前を設定します。
      • Hive 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'
      
    3. ビルドしたstrip関数が正常に実行されるのかを確認します。空白が除去されたことが確認できます。

      hive> select strip('  bee  ');
      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');
      OK
      nan
      Time taken: 0.173 seconds, Fetched: 1 row(s)
      

    関数の削除は、以下のように実行できます。

    DROP FUNCTION strip;
    
    参考

    データの特性に応じてよく使うロジックをUDFに作成しておくと、SQL構文で簡単にデータを照会できます。


    この記事は役に立ちましたか?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.