Opciones de formato para las entradas y salidas de ETL en AWS Glue - AWS Glue

Opciones de formato para las entradas y salidas de ETL en AWS Glue

Varios métodos y transformaciones PySpark y Scala de AWS Glue especifican su formato de entrada o salida mediante los parámetros format y format_options. Estos parámetros pueden adoptar los valores siguientes.

nota

Actualmente, los únicos formatos compatibles con los trabajos de ETL de streaming son JSON, CSV, Parquet, ORC, Avro y Grok.

Para trabajos que acceden a tablas que se rigen por AWS Lake Formation, AWS Glue admite la lectura y escritura de todos los formatos admitidos por las tablas que rige Lake Formation. Para obtener la lista actualizada de los formatos admitidos para tablas que se rigen por AWS Lake Formation, consulte Notas y restricciones para las tablas regidas en la Guía para desarrolladores de AWS Lake Formation.

nota

Para escribir Apache Parquet, ETL de AWS Glue solo admite la escritura en una tabla regida al especificar una opción para un tipo de escritor de Parquet personalizado optimizado para marcos dinámicos. Al escribir en una tabla regida con el formato de parquet, debe agregar la clave useGlueParquetWriter con un valor de true en los parámetros de la tabla.

format="avro"

Este valor indica el formato de datos Apache Avro.

Puede utilizar los siguientes valores format_options con format="avro":

  • version: especifica la versión del formato lector/escritor Apache Avro que se va a soportar. El valor predeterminado es 1.7. Puede especificar format_options={"version": “1.8”} para habilitar el tipo de lectura y escritura lógico de Avro. Para obtener más información, consulte la especificación de Apache Avro 1.7.7 y la especificación de Apache Avro 1.8.2.

    El conector de Apache Avro 1.8 admite las siguientes conversiones de tipo lógico:

Para el lector: en esta tabla, se muestra la conversión entre el tipo de datos de Avro (tipo lógico y tipo primitivo de Avro) y el tipo de datos DynamicFrame de AWS Glue para las versiones 1.7 y 1.8 del lector de Avro.

Tipo de datos de Avro:

Tipo lógico

Tipo de datos de Avro:

Tipo primitivo de Avro

Tipo de datos DynamicFrame de Glue:

Lector 1.7 de Avro

Tipo de datos DynamicFrame de Glue:

Lector 1.8 de Avro

Decimal bytes BINARY Decimal
Decimal fijo BINARY Decimal
Fecha int INT Fecha
Tiempo (milisegundos) int INT INT
Tiempo (microsegundos) long LONG LONG
Marca de tiempo (milisegundos) long LONG Marca temporal
Marca de tiempo (microsegundos) long LONG LONG
Duración (no es un tipo lógico) fijo de 12 BINARY BINARY

Para el escritor: en esta tabla, se muestra la conversión entre el tipo de datos DynamicFrame de AWS Glue y el tipo de datos de Avro para las versiones 1.7 y 1.8 del escritor de Avro.

Tipo de datos DynamicFrame de AWS Glue Tipo de datos de Avro:

Escritor 1.7 de Avro

Tipo de datos de Avro:

Escritor 1.8 de Avro

Decimal Cadena decimal
Fecha Cadena date
Marca temporal Cadena marca temporal (microsegundos)

format="csv"

Este valor designa comma-separated-values como el formato de datos (por ejemplo, consulte RFC 4180 y RFC 7111).

Puede utilizar los siguientes valores format_options con format="csv":

  • separator: especifica el carácter delimitador. El valor predeterminado es una coma: ",", pero puede especificarse cualquier otro carácter.

  • escaper: especifica un carácter que se usa para aplicar escape. Esta opción solo se usa cuando se leen archivos CSV. El valor predeterminado es none. Si se habilita, el carácter que va inmediatamente después se usa tal cual, excepto un pequeño conjunto de escapes conocidos (\n, \r, \t y \0).

  • quoteChar: especifica el carácter que se usa para aplicar comillas. El carácter predeterminado es una comilla doble: '"'. Establezca esta opción en -1 para desactivar las comillas por completo.

  • multiLine: un valor booleano que especifica si un solo registro puede abarcar varias líneas. Esto puede suceder cuando un campo contiene un carácter de nueva línea entre comillas. Debe configurar esta opción en True si un registro abarca varias líneas. El valor predeterminado es False, que permite una división de archivo más dinámica durante el análisis.

  • withHeader: un valor booleano que especifica si la primera línea se debe tratar como un encabezado. El valor predeterminado es False. Esta opción se puede utilizar en la clase DynamicFrameReader.

  • writeHeader: un valor booleano que especifica si se debe escribir el encabezado en la salida. El valor predeterminado es True. Esta opción se puede utilizar en la clase DynamicFrameWriter.

  • skipFirst: un valor booleano que especifica si se debe omitir la primera línea de datos. El valor predeterminado es False.

  • optimizePerformance: un valor booleano que especifica si se debe utilizar el lector CSV SIMD avanzado junto con los formatos de memoria columnar basados en Apache Arrow. Solo se encuentra disponible en   AWS Glue 3.0.

En el siguiente ejemplo, se muestra cómo especificar las opciones de formato dentro de un script de trabajo de ETL de AWS Glue.

glueContext.write_dynamic_frame.from_options( frame = datasource1, connection_type = "s3", connection_options = { "path": "s3://s3path" }, format = "csv", format_options={ "quoteChar": -1, "separator": "|" }, transformation_ctx = "datasink2")

Uso del lector CSV SIMD vectorizado con formato columnar de Apache Arrow

AWS GlueLa versión 3.0 de agrega el soporte para utilizar Apache Arrow como el formato columnar en memoria, lo cual permite agrupar registros por lotes en forma columnar. La agrupación por lotes reduce los cuellos de botella de CPU relacionados con la gestión de cambios de esquema en lotes de registros y aumenta la eficiencia de la recuperación de datos desde búferes de columnas. AWS Glue vectoriza los lectores CSV con el uso de conjuntos de instrucciones SIMD de CPU y algoritmos microparalelos. Con estas optimizaciones, la versión 3.0 de AWS Glue logra una considerable aceleración del rendimiento en comparación con el uso de DynamicFrame o Spark DataFrames de AWS Glue basados en filas.

Para utilizar el lector optimizado con el formato Arrow, configure “optimizePerformance” en verdadero en format_options o propiedad de la tabla.

glueContext.create_dynamic_frame.from_options( frame = datasource1, connection_type = "s3", connection_options = {"paths": ["s3://s3path"]}, format = "csv", format_options={ "optimizePerformance": True, "separator": "," }, transformation_ctx = "datasink2")

Limitaciones para el lector CSV vectorizado

Presenta las siguientes limitaciones:

  • No soporta opciones de formato multiLine y escaper. Utiliza el escaper predeterminado del carácter de comillas dobles “”. Cuando se establecen estas opciones, AWS Glue automáticamente vuelve a utilizar el lector CSV basado en filas.

  • No soporta la creación de un DynamicFrame con ChoiceType.

  • No soporta la creación de un DynamicFrame con registros de error.

  • No soporta la lectura de archivos CSV con caracteres multiByte, como caracteres japoneses o chinos.

format="ion"

Este valor designa Amazon Ion como el formato de datos. (Para obtener más información, consulte Especificación de Amazon Ion).

Actualmente, AWS Glue no admite ion para salida.

No hay valores format_options para format="ion".

format="grokLog"

Este valor designa un formato de datos de registro especificado por uno o varios patrones de Logstash Grok (por ejemplo, consulte Referencia de Logstash [6.2]: complemento de filtro de Grok).

Actualmente, AWS Glue no admite groklog para salida.

Puede utilizar los siguientes valores format_options con format="grokLog":

  • logFormat: especifica el patrón de Grok que coincide con el formato del registro.

  • customPatterns: especifica los patrones de Grok adicionales que se utilizan aquí.

  • MISSING: especifica la señal que se utilizará en la identificación de los valores que faltan. El valor predeterminado es '-'.

  • LineCount: especifica el número de líneas en cada registro. El valor predeterminado es '1' y actualmente solo se admiten los registros de una sola línea.

  • StrictMode: un valor booleano que especifica si el modo estricto está habilitado. En modo estricto, el lector no efectúa la conversión o recuperación de tipo automática. El valor predeterminado es "false".

format="json"

Este valor designa un formato de datos JSON (JavaScript Object Notation).

Puede utilizar los siguientes valores format_options con format="json":

  • jsonPath: una expresión JsonPath que identifica un objeto que se leerá en los registros. Esto resulta particularmente útil cuando un archivo contiene registros anidados en una matriz exterior. Por ejemplo, la siguiente expresión JsonPath se dirige al campo id de un objeto JSON.

    format="json", format_options={"jsonPath": "$.id"}
  • multiLine: un valor booleano que especifica si un solo registro puede abarcar varias líneas. Esto puede suceder cuando un campo contiene un carácter de nueva línea entre comillas. Debe configurar esta opción en "true" si un registro abarca varias líneas. El valor predeterminado es "false", que permite una división de archivo más dinámica durante el análisis.

format="orc"

Este valor designa Apache ORC como el formato de datos. (Para obtener más información, consulte ORC de LanguageManual).

No hay valores format_options para format="orc". No obstante, se le pueden pasar las opciones que acepte el código SparkSQL subyacente mediante el parámetro de mapa connection_options.

format="parquet"

Este valor designa Apache Parquet como el formato de datos, pero también brinda la opción de utilizar un tipo de escritor de Parquet personalizado, optimizado para Dynamic Frames. No se necesita un esquema calculado previamente antes de realizar la operación de escritura. Cuando se especifica la opción useGlueParquetWriter, el escritor calcula y modifica el esquema dinámicamente a medida que llegan los datos.

Puede utilizar los siguientes valores de format_options:

  • useGlueParquetWriter: especifica el uso de un tipo personalizado de escritor Parquet optimizado para marcos dinámicos. El formato de salida es Parquet.

Consulte el siguiente ejemplo, donde sink es el objeto devuelto por glue_context.getSink().

sink.setFormat("parquet", useGlueParquetWriter=True)

Limitaciones cuando se especifica useGlueParquetWriter:

  • El escritor solo admite la evolución de los esquemas, como agregar o eliminar columnas, pero no permite cambiar los tipos de columnas, como sucede con ResolveChoice.

  • Es escritor no puede almacenar archivos solo de esquema.

  • La opción solo se puede transferir como un formato para los destinos de datos.

Además, se pueden transferir a este formato las opciones que acepte el código SparkSQL subyacente mediante el parámetro de mapa connection_options. Por ejemplo, se puede establecer una configuración de Spark como mergeSchema para que el lector de Spark de AWS Glue fusione el esquema para todos los archivos.

  • compression: especifica el códec de compresión que se utiliza para escribir archivos Parquet. El códec de compresión que se utiliza con el formato glueparquet es totalmente compatible con org.apache.parquet.hadoop.metadata.CompressionCodecName *, que incluye soporte para "uncompressed", "snappy", "gzip" y "lzo". El valor predeterminado es "snappy".

  • blockSize: especifica el tamaño en bytes de un grupo de filas que se están almacenando en el búfer de la memoria en megabytes. El valor predeterminado es 134217728 o 128 MB.

  • pageSize: especifica el tamaño en bytes de la unidad más pequeña que debe leerse por completo para obtener acceso a un único registro. El valor predeterminado es 1048576 o 1 MB.

format="xml"

Este valor designa XML como el formato de datos, analizado mediante una adaptación del analizador Origen de datos XML para Apache Spark.

Actualmente, AWS Glue no admite "xml" para salida.

Puede utilizar los siguientes valores format_options con format="xml":

  • rowTag: especifica la etiqueta XML en el archivo que se tratará como una fila. Las etiquetas de fila no pueden autocerrarse.

  • encoding: especifica la codificación de caracteres. El valor predeterminado es "UTF-8".

  • excludeAttribute: un valor booleano que especifica si desea excluir o no atributos en elementos. El valor predeterminado es "false".

  • treatEmptyValuesAsNulls: un valor booleano que especifica si los espacios en blanco se tratan como un valor nulo. El valor predeterminado es "false".

  • attributePrefix: un prefijo de atributos para diferenciarlos de los elementos. Este prefijo se utiliza para los nombres de campo. El valor predeterminado es "_".

  • valueTag: la etiqueta que se utiliza para un valor cuando hay atributos en el elemento que no tienen elementos secundarios. El valor predeterminado es "_VALUE".

  • ignoreSurroundingSpaces: un valor booleano que especifica si se deben ignorar los espacios en blanco alrededor de los valores. El valor predeterminado es "false".

  • withSchema: un valor de cadena que contiene el esquema esperado. Si no utiliza esta opción, AWS Glue infiere el esquema a partir de los datos XML.

Ejemplo

Este es un ejemplo de uso de la opción del formato withSchema para especificar el esquema para los datos XML.

schema = StructType([ Field("id", IntegerType()), Field("name", StringType()), Field("nested", StructType([ Field("x", IntegerType()), Field("y", StringType()), Field("z", ChoiceType([IntegerType(), StringType()])) ])) ]) datasource0 = create_dynamic_frame_from_options( connection_type, connection_options={"paths": ["s3://xml_bucket/someprefix"]}, format="xml", format_options={"withSchema": json.dumps(schema.jsonValue())}, transformation_ctx = "" )