

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Implementación de funciones definidas por el usuario
<a name="how-zeppelin-udf"></a>

Las funciones definidas por el usuario (UDFs) son puntos de extensión que permiten invocar la lógica de uso frecuente o la lógica personalizada que no se puede expresar de otro modo en las consultas. Puedes usar Python o un lenguaje JVM como Java o Scala para implementar tus párrafos dentro de tu UDFs cuaderno de Studio. También puedes añadir a tu bloc de notas de Studio archivos JAR externos que contengan archivos JVM UDFs implementados en un lenguaje JVM. 

Al implementar JARs ese registro de clases abstractas que subclasifican `UserDefinedFunction` (o tus propias clases abstractas), usa el alcance proporcionado en Apache Maven, las declaraciones de `compileOnly` dependencia en Gradle, el alcance proporcionado en SBT o una directiva equivalente en la configuración de compilación de tu proyecto UDF. Esto permite que el código fuente de la UDF se compile con los de Flink APIs, pero las clases de la API de Flink no se incluyen en sí mismas en los artefactos de compilación. Consulte este [pom](https://github.com/aws-samples/kinesis-udfs-textanalytics/blob/ec27108faa48f1a4c5d173ed3a2ef4565b58b5b5/kinesis-udfs-textanalytics-linear/pom.xml#L47) del ejemplo jar UDF, que cumple con este requisito previo en un proyecto de Maven. 

**nota**  
Para ver un ejemplo de configuración, consulte [Translate, redact and analyze streaming data using SQL functions with Amazon Managed Service para Apache Flink, Amazon Translate, and 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/) en el *AWS blog de Machine Learning*.

Para usar la consola para añadir archivos JAR de la UDF a su cuaderno de Studio, siga estos pasos:

1. Cargue su archivo JAR UDF en Amazon S3.

1. En el Consola de administración de AWS, elige la opción de creación **personalizada para crear** tu bloc de notas de Studio.

1. Siga el flujo de trabajo de creación de cuadernos de Studio hasta llegar al paso de **Configuración**.

1. En la sección **Funciones definidas por el usuario**, seleccione **Añadir función definida por el usuario**.

1. Especifique la ubicación en Amazon S3 del archivo JAR o el archivo ZIP que contiene la implementación de su UDF.

1. Seleccione **Save changes (Guardar cambios)**.

Para añadir un JAR de UDF al crear un nuevo cuaderno de Studio mediante la [CreateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_CreateApplication.html)API, especifique la ubicación del JAR en el tipo de `CustomArtifactConfiguration` datos. Para añadir un JAR de UDF a un bloc de notas de Studio existente, invoca la operación de la [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html)API y especifica la ubicación del JAR en el `CustomArtifactsConfigurationUpdate` tipo de datos. Como alternativa, puedes utilizarla Consola de administración de AWS para añadir archivos JAR de la UDF a tu bloc de notas de Studio.

## Consideraciones con funciones definidas por el usuario
<a name="how-zeppelin-udf-considerations"></a>
+ Managed Service para Apache Flink Studio utiliza la [terminología de Apache Zeppelin](https://zeppelin.apache.org/docs/0.9.0/quickstart/explore_ui.html), según la cual un cuaderno es una instancia de Zeppelin que puede contener varias notas. De este modo, cada nota puede contener varios párrafos. Con Managed Service para Apache Flink Studio, el proceso de interpretación se comparte entre todas las notas del cuaderno. Por lo tanto, si realiza un registro de funciones explícito utilizando [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-) en una nota, se puede hacer referencia a la misma tal cual en otra nota del mismo cuaderno. 

  Sin embargo, la operación *Implementar como aplicación* funciona en una nota *individual* y no en todas las notas del cuaderno. Al realizar la implementación como aplicación, solo se utiliza el contenido de la nota activa para generar la aplicación. Cualquier registro de funciones explícito realizado en otros cuadernos no forma parte de las dependencias de aplicación generadas. Además, durante la opción Implementar como aplicación, se produce un registro implícito de la función al convertir el nombre de la clase principal de JAR en una cadena en minúsculas.

   Por ejemplo, si `TextAnalyticsUDF` es la clase principal de JAR de UDF, un registro implícito dará como resultado el nombre de la función `textanalyticsudf`. Por lo tanto, si el registro explícito de una función en la nota 1 de Studio se produce de la siguiente manera, todas las demás notas de ese cuaderno (por ejemplo, la nota 2) pueden hacer referencia a la función por su nombre `myNewFuncNameForClass` gracias al intérprete compartido:

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

   Sin embargo, durante la implementación como operación de aplicación (nota 2), este registro explícito *no se incluirá* en las dependencias y, por lo tanto, la aplicación implementada no funcionará según lo esperado. Debido al registro implícito, de forma predeterminada se espera que todas las referencias a esta función aparezcan con `textanalyticsudf` y no `myNewFuncNameForClass`.

   Si es necesario registrar el nombre de una función personalizada, se espera que la propia nota 2 contenga otro párrafo para realizar otro registro explícito de la siguiente manera: 

  ```
  %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
  ;
  ```
+ Si tu archivo JAR de UDF incluye Flink SDKs, configura tu proyecto Java para que el código fuente de la UDF se pueda compilar con Flink SDKs, pero las clases del SDK de Flink no estén incluidas en el artefacto de compilación, por ejemplo, el JAR. 

  Puede usar el alcance `provided` en Apache Maven, las declaraciones de dependencia `compileOnly` en Gradle, el alcance `provided` en SBT o una directiva equivalente en la configuración de compilación de sus proyectos UDF. Puede consultar este [pom](https://github.com/aws-samples/kinesis-udfs-textanalytics/blob/ec27108faa48f1a4c5d173ed3a2ef4565b58b5b5/kinesis-udfs-textanalytics-linear/pom.xml#L47) del ejemplo jar UDF, que cumple con este requisito previo en un proyecto de Maven. Para ver un step-by-step tutorial completo, consulte este tutorial sobre cómo [traducir, redactar y analizar datos de streaming mediante funciones de SQL con Amazon Managed Service para Apache Flink, Amazon Translate y 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/).