

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 實作使用者定義的函數
<a name="how-zeppelin-udf"></a>

使用者定義的函數 (UDF) 是一些延伸點，可讓您呼叫常用邏輯或無法在查詢中以其他方式表示的自訂邏輯。您可以使用 Python 或類似 Java 或 Scala 的 JVM 語言，在 Studio 筆記本的段落中實作您的 UDF。您也可以將包含以 JVM 語言實作的 UDF 新增至 Studio 筆記本外部 JAR 檔案。

當實作註冊該子類 `UserDefinedFunction` (或您自己的抽像類) 的抽像類的 JAR 時，請使用 Apache Maven 中提供的範圍、Gradle 中的 `compileOnly` 相依性宣告、SBT 中提供的範圍或 UDF 專案建置組態中的等效指令。這可讓 UDF 來源程式碼根據 Flink API 進行編譯，但 Flink API 類別本身並不包含在建置成品中。請參閱來自 UDF jar 範例的此 [pom](https://github.com/aws-samples/kinesis-udfs-textanalytics/blob/ec27108faa48f1a4c5d173ed3a2ef4565b58b5b5/kinesis-udfs-textanalytics-linear/pom.xml#L47)，該範例符合 Maven 專案上的這種先決條件。

**注意**  
如需範例設定，請參閱 *AWS 機器學習部落格*中的[搭配使用 SQL 函數與 Amazon Managed Service for Apache Flink、Amazon Translate 和 Amazon Comprehend 來翻譯、修訂和分析串流資料](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. 指定 JAR 檔案的 Amazon S3 位置，或是具有 UDF 實作的 ZIP 檔案。

1. 選擇**儲存變更**。

若要在使用 [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 位置。或者，您可以使用 AWS 管理主控台 將 UDF JAR 檔案新增至 Studio 筆記本。

## 使用使用者定義函數的考量
<a name="how-zeppelin-udf-considerations"></a>
+ Managed Service for Apache Flink Studio 使用 [Apache Zeppelin 術語](https://zeppelin.apache.org/docs/0.9.0/quickstart/explore_ui.html)，其中筆記本是指一個 Zeppelin 執行個體，可以包含多條筆記。然後，每條筆記可以包含多個段落。借助 Managed Service for Apache Flink Studio，解譯器過程在筆記本中的所有筆記間共用。因此，如果您在一條筆記中使用 [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 執行部署為應用程式操作期間，此明確註冊*將不包含*在相依性中，因此已部署的應用程式將無法按預期執行。由於隱含註冊，依預設，對此函數的所有引用都應帶有 `textanalyticsudf` 而不是 `myNewFuncNameForClass`。

   如果需要進行自訂函數名稱註冊，則筆記 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，請設定您的 Java 專案，以便 UDF 來源程式碼可以針對 Flink SDK 進行編譯，但 Flink SDK 類別本身不包含在建置成品中，例如 JAR。

  您可以使用 Apache Maven 中的 `provided` 範圍、Gradle 中的 `compileOnly` 相依性宣告、SBT 中的 `provided` 範圍或 UDF 專案建置組態中的等效指令。您可以參閱 UDF jar 範例中的此 [pom](https://github.com/aws-samples/kinesis-udfs-textanalytics/blob/ec27108faa48f1a4c5d173ed3a2ef4565b58b5b5/kinesis-udfs-textanalytics-linear/pom.xml#L47)，該範例符合 maven 專案上的這種先決條件。如需完整的逐步教學課程，請參閱[搭配使用 SQL 函數與 Amazon Managed Service for Apache Flink、Amazon Translate 和 Amazon Comprehend 來翻譯、修訂和分析串流資料](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/)。