

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ユーザー定義関数を実装する
<a name="how-zeppelin-udf"></a>

ユーザー定義関数 (UDF) は、頻繁に使用されるロジックや、他の方法ではクエリで表現できないカスタムロジックを呼び出すことができる拡張ポイントです。Python または Java や Scala などの JVM 言語を使用して、Studio ノートブック内の段落に UDF を実装できます。JVM 言語で実装された UDF を含む外部 JAR ファイルを Studio ノートブックに追加することもできます。

`UserDefinedFunction`　( または独自の抽象クラス ） をサブクラス化する抽象クラスを登録する JAR を実装する場合は、Apache Maven で提供されている範囲、Gradle の `compileOnly` 依存宣言、SBT で提供されている範囲、または UDF プロジェクトのビルド設定で同等の命令を使用します。これにより、UDF ソースコードは Flink API に対してコンパイルできますが、Flink API クラス自体はビルドアーティファクトに含まれません。Maven プロジェクトでこのような前提条件を守っている UDF jar の例の「[pom](https://github.com/aws-samples/kinesis-udfs-textanalytics/blob/ec27108faa48f1a4c5d173ed3a2ef4565b58b5b5/kinesis-udfs-textanalytics-linear/pom.xml#L47)」を参照してください。

**注記**  
セットアップ例については、「*AWS 機械学習ブログ*」の「[Amazon Managed Service for Apache Flink, Amazon Translate, and Amazon Comprehendを搭載した SQL 関数を使用してストリーミングデータの翻訳、修正、分析](https://aws.amazon.com/blogs/machine-learning/translate-redact-and-analyze-streaming-data-using-sql-functions-with-amazon-kinesis-data-analytics-amazon-translate-and-amazon-comprehend/)」を参照してください。

コンソールを使用して UDF JAR ファイルを Studio ノートブックに追加するには、以下の手順に従います。

1. UDF JAR ファイルを Amazon S3 にアップロードします。

1. で AWS マネジメントコンソール、Studio ノートブックを作成するための**カスタム作成**オプションを選択します。

1. Studio ノートブック作成ワークフローに従って **設定** ステップまで進みます。

1. [**ユーザー定義関数**] セクションで、[**ユーザー定義関数を追加**] を選択します。

1. UDF が実装されている JAR ファイルまたは ZIP ファイルの Amazon S3 ロケーションを指定します。

1. **[Save changes]** (変更の保存) をクリックします。

[CreateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_CreateApplication.html) API を使用して新しい Studio ノートブックを作成するときに UDF JAR を追加するには、 `CustomArtifactConfiguration` データタイプで JAR のロケーションを指定します。UDF JAR を既存の Studio ノートブックに追加するには、[UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) API オペレーションを呼び出し、 `CustomArtifactsConfigurationUpdate` データタイプで JAR のロケーションを指定します。または、 を使用して UDF JAR ファイルを Studio ノートブック AWS マネジメントコンソール に追加することもできます。

## ユーザー定義関数に関する考慮事項
<a name="how-zeppelin-udf-considerations"></a>
+ Apache Flink Studio 用 Managed Service では、「[Apache Zeppelin の用語](https://zeppelin.apache.org/docs/0.9.0/quickstart/explore_ui.html)」が使われています。ここで、ノートブックは、複数のノートを含むことができる Zeppelin インスタンスです。これにより、各ノートには複数の段落を含めることができます。Apache Flink Studio 用 Managed Service では、インタープリタープロセスはノートブックのすべてのノートで共有されます。そのため、あるノートで「[CreateTemporarySystemFunction](https://nightlies.apache.org/flink/flink-docs-master/api/java/org/apache/flink/table/api/TableEnvironment.html#createTemporarySystemFunction-java.lang.String-java.lang.Class-)」を使用して明示的な関数登録を実行すると、同じノートブックの別のノートでも同じ関数をそのまま参照できます。

  ただし、「アプリケーションとしてデプロイ」操作は、ノートブック内のすべてのノートではなく、「個々」のノートに適用されます。アプリケーションとしてデプロイすると、アクティブノートの内容のみがアプリケーションの生成に使用されます。他のノートブックで行われる明示的な関数登録は、生成されるアプリケーションの依存関係の一部ではありません。さらに、アプリケーション・オプションとしてデプロイする際に、JAR のメインクラス名を小文字の文字列に変換することで、暗黙的な関数登録が行われます。

   たとえば、 `TextAnalyticsUDF` が UDF JAR のメインクラスである場合、暗黙的に登録すると関数名 `textanalyticsudf` になります。そのため、Studio のノート 1 に次のような明示的な関数登録があった場合、共有インタープリタがあるため、そのノート（例えばノート 2）の他のすべてのノートは、名前 `myNewFuncNameForClass` でその関数を参照することができ

  `stenv.createTemporarySystemFunction("myNewFuncNameForClass", new TextAnalyticsUDF())`

   しかし、ノート 2 のアプリケーションとしてデプロイする操作では、この明示的な登録は依存関係に「含まれない」ため、デプロイされたアプリケーションは期待通りに動作しません。暗黙的に登録されるため、デフォルトでは、この関数へのすべての参照は `myNewFuncNameForClass` ではなく `textanalyticsudf` であることが想定されます。

   カスタム関数名を登録する必要がある場合は、ノート 2 自体に別の段落を設け、次のように明示的に登録することが想定されます。

  ```
  %flink(parallelism=l)
  import com.amazonaws.kinesis.udf.textanalytics.TextAnalyticsUDF 
  # re-register the JAR for UDF with custom name
  stenv.createTemporarySystemFunction("myNewFuncNameForClass", new TextAnalyticsUDF())
  ```

  ```
  %flink. ssql(type=update, parallelism=1) 
  INSERT INTO
      table2
  SELECT
      myNewFuncNameForClass(column_name)
  FROM
      table1
  ;
  ```
+ UDF JAR に Flink SDK が含まれている場合は、UDF ソースコードが Flink SDK に対してコンパイルできるように Java プロジェクトを設定しますが、Flink SDK クラス自体はビルドアーティファクト（JAR など）に含まれません。

  Apache Maven の `provided` スコープ、Gradle の `compileOnly` 依存宣言、SBT の `provided` スコープ、または UDF プロジェクトのビルド設定で同等の命令を使用できます。この「[pom](https://github.com/aws-samples/kinesis-udfs-textanalytics/blob/ec27108faa48f1a4c5d173ed3a2ef4565b58b5b5/kinesis-udfs-textanalytics-linear/pom.xml#L47)」は、Maven プロジェクトでこのような前提条件を満たす UDF jar の例から参照できます。詳細な手順のチュートリアルについては、「[Amazon Managed Service for Apache Flink、Amazon Translate、Amazon Comprehend で SQL 関数を使用してストリーミングデータを翻訳、編集、分析する](https://aws.amazon.com/blogs/machine-learning/translate-redact-and-analyze-streaming-data-using-sql-functions-with-amazon-kinesis-data-analytics-amazon-translate-and-amazon-comprehend/)」を参照してください。