Prácticas recomendadas para utilizar Athena con AWS Glue - Amazon Athena

Prácticas recomendadas para utilizar Athena con AWS Glue

Al utilizar Athena con el AWS Glue Data Catalog, puede usar AWS Glue para crear las bases de datos y las tablas (esquemas) que consultará en Athena, o bien puede utilizar Athena para crear un esquema y entonces utilizarlo en AWS Glue u otros servicios relacionados. Este tema contiene consideraciones y prácticas recomendadas para utilizar ambos métodos.

Desde el punto de vista tecnológico, Athena utiliza Trino para procesar instrucciones DML y Hive para procesar instrucciones DDL que se usan en la creación y modificación de esquemas. Con estas tecnologías, es preciso respetar un par de convenciones para que Athena y AWS Glue funcionen bien conjuntamente.

En este tema

Nombres de base de datos, tablas y columnas

Cuando cree un esquema en AWS Glue para realizar consultas en Athena, tenga en cuenta lo siguiente:

  • Los caracteres aceptables para los nombres de base de datos, los nombres de tablas y los nombres de columnas en AWS Glue deben ser una cadena de UTF-8. La cadena debe tener 1 byte de largo, como mínimo, y 255 bytes de largo, como máximo. Los caracteres que se pueden usar incluyen espacios y se definen mediante el siguiente patrón de cadena de una sola línea:

    [\u0020-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF\t]*
  • Actualmente, el patrón de expresiones regulares AWS Glue permite añadir espacios iniciales al principio de los nombres. Dado que estos espacios iniciales pueden ser difíciles de detectar y pueden provocar problemas de usabilidad tras su creación, evite crear nombres de objetos que tengan espacios iniciales.

  • Si usa una plantilla AWS::Glue::Database de AWS CloudFormation para crear una base de datos de AWS Glue y no especifica ningún nombre de la base de datos, AWS Glue genera automáticamente un nombre de la base de datos con el formato nombre_recurso–cadena_aleatoria que no es compatible con Athena.

  • Puede utilizar el administrador de catálogo de AWS Glue para cambiar el nombre de las columnas, pero no los nombres de las tablas ni los nombres de bases de datos. Para evitar esta limitación, debe usar una definición de la base de datos antigua para crear una base de datos con el nombre nuevo. A continuación, utilice las definiciones de las tablas de la base de datos antigua para volver a crear las tablas en la base de datos nueva. Para ello, puede utilizar la AWS CLI o el SDK de AWS Glue. Para ver los pasos, consulte Uso de la AWS CLI para recrear una base de datos de AWS Glue y sus tablas.

Para obtener más información sobre las bases de datos y las tablas de AWS Glue, consulte Bases de datos y Tablas en la Guía para desarrolladores de AWS Glue.

Uso de rastreadores AWS Glue

Los rastreadores de AWS Glue son útiles para detectar el esquema de conjuntos de datos y registrarlos como tablas en el catálogo de datos de AWS Glue. Los rastreadores revisan sus datos y establecen cuál es el esquema. Además, los rastreadores puede detectar y registrar particiones. Para obtener más información, consulte Definición de rastreadores en la Guía para desarrolladores de AWS Glue. Las tablas de datos que se han rastreado correctamente se pueden consultar desde Athena.

nota

Athena no reconoce los patrones de exclusión que especifica en un rastreador de AWS Glue. Por ejemplo, si tiene un bucket de Amazon S3 que contiene tanto .csv como .json y se excluyen los archivos .json desde el rastreador, Athena consulta ambos grupos de archivos. Para evitar esto, coloque los archivos que desea excluir en una ubicación diferente.

Programación de un rastreador para mantener AWS Glue Data Catalog y Simple Storage Service (Amazon S3) sincronizados

Los rastreadores de AWS Glue se pueden configurar para ejecutarse siguiendo una programación o bajo demanda. Para obtener más información, consulte Programaciones basadas en el tiempo para trabajos y rastreadores en la Guía para desarrolladores de AWS Glue.

Si los datos para una tabla con particiones llegan a una hora establecida, puede configurar un rastreador de AWS Glue para que se ejecute a una hora programada y detecte y actualice las particiones de la tabla. De esta manera, puede eliminar la necesidad de ejecutar un comando MSCK REPAIR potencialmente largo y costoso, o ejecutar manualmente un comando ALTER TABLE ADD PARTITION. Para obtener más información, consulte Particiones de tablas en la Guía para desarrolladores de AWS Glue.

Uso de varios orígenes de datos con rastreadores

Cuando un rastreador de AWS Glue analiza Amazon S3 y detecta varios directorios, utiliza una heurística para determinar dónde se encuentra la raíz de una tabla en la estructura de directorios y qué directorios son particiones de tabla. En algunos casos en que el esquema detectado en dos o más directorios es similar, el rastreador puede tratarlos como si fueran particiones en vez de tablas diferentes. Una forma de ayudar al rastreador a detectar tablas individuales consiste en añadir el directorio raíz de cada tabla como almacén de datos para el rastreador.

Las siguientes particiones en Amazon S3 son un ejemplo:

s3://DOC-EXAMPLE-BUCKET/folder1/table1/partition1/file.txt s3://DOC-EXAMPLE-BUCKET/folder1/table1/partition2/file.txt s3://DOC-EXAMPLE-BUCKET/folder1/table1/partition3/file.txt s3://DOC-EXAMPLE-BUCKET/folder1/table2/partition4/file.txt s3://DOC-EXAMPLE-BUCKET/folder1/table2/partition5/file.txt

Si los esquemas de table1 y table2 son similares, y se ha establecido un único origen de datos para s3://DOC-EXAMPLE-BUCKET/folder1/ en AWS Glue, el rastreador puede crear una única tabla con dos columnas de partición: una columna de partición que contenga table1 y table2, y otra columna que contenga de partition1 a partition5.

Para que el rastreador de AWS Glue cree dos tablas diferentes configure el rastreador con dos orígenes de datos, s3://DOC-EXAMPLE-BUCKET/folder1/table1/ y s3://DOC-EXAMPLE-BUCKET/folder1/table2, tal y como se muestra en el siguiente procedimiento.

Para agregar otro almacén de datos de S3 a un rastreador existente en AWS Glue

  1. Inicie sesión en la AWS Management Console y abra la consola de AWS Glue en https://console.aws.amazon.com/glue/.

  2. En el panel de navegación, elija Crawlers (Rastreadores).

  3. Elija el enlace a su rastreador y, a continuación, elija Edit (Editar).

  4. ParaStep 2: Choose data sources and classifiers (Paso 2: Elegir orígenes de datos y clasificadores), elija Edit (Editar).

  5. En Data sources (Orígenes de datos), elija Add a data source (Agregar un origen de datos).

  6. En el cuadro de diálogo Add data source (Agregar origen de datos), en S3 path (Ruta de S3), elija Browse (Examinar).

  7. Elija el bucket que desee actualizar y, a continuación, elija Choose (Elegir).

    El origen de datos que ha agregado aparece en la lista Data sources (Orígenes de datos).

  8. Elija Siguiente.

  9. En la página Configurar ajustes de seguridad, cree o elija un rol de IAM para el rastreador y, a continuación, elija Siguiente.

  10. Asegúrese de que la ruta de S3 termina en una barra diagonal y, a continuación, seleccione Add an S3 data source (Agregar un origen de datos de S3).

  11. En la página Set output and scheduling (Definir la salida y la programación), en Output configuration (Configuración de salida), elija la base de datos de destino.

  12. Elija Siguiente.

  13. En la página Review and update (Revisar y actualizar), revise las elecciones que ha realizado. Para editar un paso, seleccione Edit (Editar).

  14. Elija Actualizar.

Sincronización de un esquema de partición para evitar "HIVE_PARTITION_SCHEMA_MISMATCH"

Por cada tabla de AWS Glue Data Catalog que tenga columnas de partición, el esquema se almacena en el nivel de tabla y para cada partición individual de la tabla. El esquema de las particiones lo rellena un rastreador de AWS Glue basándose en la muestra de datos que lee en la partición. Para obtener más información, consulte Uso de varios orígenes de datos con rastreadores.

Cuando Athena ejecuta una consulta, valida el esquema de la tabla y el esquema de las particiones necesarias para la consulta. En la validación se comparan los tipos de datos de la columna en orden y se confirma que estos tipos de datos coinciden en el caso de las columnas que se solapan. De esta forma, se evita que se produzcan operaciones imprevistas como añadir o eliminar columnas del medio de una tabla. Si Athena detecta que el esquema de una partición es diferente del esquema de la tabla, es posible que Athena no pueda procesar la consulta y genere el error HIVE_PARTITION_SCHEMA_MISMATCH.

Existen varias maneras de resolver este problema. En primer lugar, si los datos se añadieron por error, puede eliminar los archivos de datos que generan la diferencia en el esquema, anular la partición y volver a rastrear los datos. En segundo lugar, puede anular la partición individual y, a continuación, ejecutar MSCK REPAIR en Athena para volver a crear la partición utilizando el esquema de la tabla. Esta segunda opción solo funciona si está convencido de que el esquema aplicado continuará leyendo los datos correctamente.

Actualización de los metadatos de una tabla

Después de un rastreo, el rastreador de AWS Glue asigna automáticamente determinados metadatos de tabla para hacerlos compatibles con otras tecnologías externas como Apache Hive, Presto y Spark. Ocasionalmente, el rastreador puede asignar incorrectamente las propiedades de los metadatos. Corrija manualmente las propiedades en AWS Glue antes de consultar la tabla con Athena. Para obtener más información, consulte Visualización y edición de los detalles de una tabla en la Guía para desarrolladores de AWS Glue.

AWS Glue puede asignar erróneamente metadatos cuando un archivo CSV tiene todos los campos de datos entre comillas, lo que hace que se interprete incorrectamente la propiedad serializationLib. Para obtener más información, consulte Datos de archivos CSV entre comillas.

Trabajo con archivos CSV

Los archivos CSV ponen ocasionalmente los valores de datos destinados a cada columna entre comillas y es posible que los archivos CSV contengan valores de encabezado que no formen parte de los datos que se van a analizar. Cuando utilice AWS Glue para crear esquemas a partir de estos archivos, siga las instrucciones de esta sección.

Datos de archivos CSV entre comillas

Puede tener un archivo CSV que contenga campos de datos entre comillas dobles como el siguiente ejemplo:

"John","Doe","123-555-1231","John said \"hello\"" "Jane","Doe","123-555-9876","Jane said \"hello\""

Para ejecutar una consulta en Athena en una tabla creada a partir de un archivo CSV que contiene valores entre comillas, debe modificar las propiedades de la tabla en AWS Glue para utilizar el OpenCSVSerDe. Para obtener más información acerca de SerDe de OpenCSV, consulte OpenCSVSerDe para el procesamiento de CSV.

Para editar propiedades de tabla en la consola de AWS Glue
  1. En el panel de navegación de la consola de AWS Glue, elija Tables.

  2. Elija el enlace para la tabla que quiere editar y, a continuación, elija Actions (Acciones), Edit table details (Editar detalles de la tabla).

  3. En la página Editar tabla, realice los siguientes cambios:

    • En Serialization lib (Biblioteca de serialización), ingrese org.apache.hadoop.hive.serde2.OpenCSVSerde.

    • Para Patrones de Serde, ingrese los siguientes valores para las claves escapeChar, quoteChar y separatorChar:

      • Para escapeChar, ingrese una barra diagonal inversa (\).

      • Para quoteChar, ingrese una comilla doble (").

      • Para separatorChar, ingrese una coma (,).

  4. Seleccione Guardar.

Para obtener más información, consulte Visualización y edición de los detalles de una tabla en la Guía para desarrolladores de AWS Glue.

Actualización de propiedades de tablas de AWS Glue mediante programación

Puede utilizar la operación de la API UpdateTable de AWS Glue o el comando de la CLI update-table para modificar el bloque SerDeInfo en la definición de tabla, como en el siguiente ejemplo JSON.

"SerDeInfo": { "name": "", "serializationLib": "org.apache.hadoop.hive.serde2.OpenCSVSerde", "parameters": { "separatorChar": "," "quoteChar": "\"" "escapeChar": "\\" } },

Archivos CSV con encabezados

Cuando define una tabla en Athena con una instrucción CREATE TABLE, puede utilizar la propiedad de tabla skip.header.line.count para ignorar los encabezados en los datos CSV, como en el siguiente ejemplo.

... STORED AS TEXTFILE LOCATION 's3://DOC-EXAMPLE-BUCKET/csvdata_folder/'; TBLPROPERTIES ("skip.header.line.count"="1")

También puede eliminar los encabezados de CSV de antemano para que la información de encabezado no se incluya en los resultados de la consulta de Athena. Una forma de hacerlo es utilizar trabajos de AWS Glue, que se encargan de las tareas de extracción, transformación y carga (ETL). Puede escribir scripts en AWS Glue en un lenguaje que es una extensión del dialecto PySpark Python. Para obtener más información, consulte la sección sobre creación de trabajos en GlueAWS en la Guía para desarrolladores de AWS Glue.

En el siguiente ejemplo se muestra una función de un script de AWS Glue que escribe un marco dinámico utilizando from_options y establece la opción de formato writeHeader como "false", lo que elimina la información de encabezado:

glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://DOC-EXAMPLE-BUCKET/MYTABLEDATA/"}, format = "csv", format_options = {"writeHeader": False}, transformation_ctx = "datasink2")

Indexación y filtrado de particiones de AWS Glue

Cuando Athena consulta las tablas divididas, recupera y filtra las particiones de tabla disponibles en el subconjunto relevante para la consulta. A medida que se agregan nuevos datos y particiones, se necesita más tiempo para procesar las particiones y el tiempo de ejecución de consulta puede aumentar. Si tiene una tabla con un gran número de particiones que crece con el tiempo, considere la posibilidad de utilizar indexación y filtrado de particiones de AWS Glue. La indexación de particiones permite a Athena optimizar el procesamiento de particiones y mejorar el rendimiento de las consultas en tablas altamente particionadas. La configuración del filtrado de particiones en las propiedades de una tabla es un proceso de dos pasos:

  1. Creación de un índice de particiones en AWS Glue.

  2. Habilitación del filtrado de particiones para la tabla.

Creación de un índice de particiones

A fin de conocer los pasos para crear un índice de particiones en AWS Glue, consulte Trabajar con índices de partición en la Guía para desarrolladores de AWS Glue. Para conocer las limitaciones de los índices de particiones en AWS Glue, consulte Acerca de los índices de particiones de esa página.

Habilitación del filtrado de particiones

A fin de habilitar el filtrado de particiones para la tabla, debe configurar una nueva propiedad de tabla en AWS Glue. Para conocer los pasos sobre cómo configurar las propiedades de la tabla en AWS Glue, consulte la página Configuración de proyección de particiones. Cuando edita los detalles de la tabla en AWS Glue, agregue el siguiente valor de clave a la sección Table properties (Propiedades de la tabla):

  • En Key (Clave), agregue partition_filtering.enabled.

  • En Value (Valor), agregue true.

Para desactivar el filtrado de particiones en esta tabla en cualquier momento, configure el valor partition_filtering.enabled como false.

Después de completar los pasos anteriores, puede volver a la consola de Athena para consultar los datos.

Para obtener más información sobre la creación de índices y filtros de particiones, consulte el artículo Mejora del rendimiento de consultas de Amazon Athena con índices de particiones de AWS Glue Data Catalog en el Blog de macrodatos de AWS.

Uso de datos geoespaciales

AWS Glue no admite de forma nativa Well-known Text (WKT), Well-Known Binary (WKB) u otros tipos de datos PostGIS. El clasificador AWS Glue analiza los datos geoespaciales y los clasifica utilizando los tipos de datos admitidos para el formato, como varchar para CSV. Al igual que ocurre con otras tablas de AWS Glue, es posible que tenga que actualizar las propiedades de las tablas creadas a partir de datos geoespaciales para permitir a Athena analizar estos tipos de datos tal y como están. Para obtener más información, consulte Uso de rastreadores AWS Glue y Trabajo con archivos CSV. Es posible que Athena no pueda analizar algunos tipos de datos geoespaciales en las tablas de AWS Glue tal y como están. Para obtener más información acerca de cómo trabajar con datos geoespaciales en Athena, consulte Consulta de datos geoespaciales.

Uso de AWS Glue para realizar trabajos de ETL con Athena

Los trabajos de AWS Glue realizan operaciones de ETL. Un trabajo de AWS Glue ejecuta un script que extrae datos de las fuentes, los transforma y los carga en los destinos. Para obtener más información, consulte la sección sobre creación de trabajos en GlueAWS en la Guía para desarrolladores de AWS Glue.

Creación de tablas con Athena para los trabajos de ETL de AWS Glue

Es necesario agregar a las tablas que cree en Athena una propiedad denominada classification, que identifica el formato de los datos. Esto permite a AWS Glue utilizar las tablas para trabajos de ETL. Los valores de clasificación pueden ser avro, csv, json, orc, parquet o xml. A continuación, se muestra un ejemplo de instrucción CREATE TABLE en Athena:

CREATE EXTERNAL TABLE sampleTable ( column1 INT, column2 INT ) STORED AS PARQUET TBLPROPERTIES ( 'classification'='parquet')

Si no se añadió la propiedad al crear la tabla, puede hacerse ahora por medio de la consola de AWS Glue.

Para agregar la propiedad de clasificación con la consola de AWS Glue

  1. Inicie sesión en la AWS Management Console y abra la consola de AWS Glue en https://console.aws.amazon.com/glue/.

  2. En el panel de navegación de la consola, elija Tables (Tablas).

  3. Elija el enlace para la tabla que quiere editar y, a continuación, elija Actions (Acciones), Edit table details (Editar detalles de la tabla).

  4. Desplácese hacia abajo hasta la sección Table properties (Propiedades de la tabla).

  5. Elija Añadir.

  6. En Clave, escriba classification.

  7. En Value (Valor), especifique un tipo de datos (por ejemplo, json).

  8. Seleccione Guardar.

    En la sección Table details (Detalles de la tabla), el tipo de datos que ha especificado aparecerá en el campo Classification (Clasificación) de la tabla.

Para obtener más información, consulte Uso de tablas en la Guía para desarrolladores de AWS Glue.

Uso de trabajos de ETL para optimizar el rendimiento de las consultas

Los trabajos de AWS Glue son útiles para transformar los datos a un formato que optimice el rendimiento de las consultas en Athena. Los formatos de datos tienen un gran impacto en el rendimiento y el costo de las consultas en Athena.

Recomendamos el uso de los formatos Parquet y ORC. AWS Glue admite la escritura en estos dos formatos de datos, lo que puede facilitar y agilizar la tarea de transformar los datos en un formato óptimo para Athena. Para obtener más información sobre estos formatos y otras formas de mejorar el rendimiento, consulte los 10 mejores consejos para ajustar el rendimiento de Amazon Athena.

Conversión de los tipos de datos SMALLINT y TINYINT en INT cuando realiza conversiones a ORC

Para reducir la probabilidad de que Athena no pueda leer los tipos de datos SMALLINT y TINYINT generados por un trabajo de ETL de AWS Glue, convierta SMALLINT y TINYINT a INT al utilizar el asistente o escribir un script para un trabajo de ETL.

Automatización de trabajos de ETL de AWS Glue

Puede configurar los trabajos de ETL de AWS Glue para que se ejecuten automáticamente basándose en desencadenadores. Esta característica es ideal cuando se insertan datos del exterior de AWS en un bucket de Amazon S3, en un formato ineficiente para realizar consultas en Athena. Para obtener más información, consulte Desencadenar trabajos de AWS Glue en la Guía para desarrolladores de AWS Glue.