MSCK REPAIR TABLE - Amazon Athena

MSCK REPAIR TABLE

Utilice el comando MSCK REPAIR TABLE para actualizar los metadatos del catálogo después de agregar particiones compatibles con Hive.

El comando MSCK REPAIR TABLE analiza un sistema de archivos como Amazon S3 en busca de particiones compatibles con Hive que se agregaron al sistema de archivos después de crear la tabla. MSCK REPAIR TABLE compara las particiones en los metadatos de la tabla y las particiones en S3. Si hay nuevas particiones en la ubicación de S3 que especificó al crear la tabla, agrega esas particiones a los metadatos y a la tabla Athena.

Al agregar particiones físicas, los metadatos del catálogo se vuelven incoherentes con el diseño de los datos en el sistema de archivos, y la información sobre las nuevas particiones debe agregarse al catálogo. Para actualizar los metadatos, ejecute MSCK REPAIR TABLE para consultar los datos en las nuevas particiones de Athena.

nota

MSCK REPAIR TABLE solo agrega particiones a los metadatos; no las elimina. Para eliminar particiones de los metadatos después de haber eliminado las particiones manualmente en Amazon S3, ejecute el comando ALTER TABLE table-name DROP PARTITION. Para obtener más información, consulte ALTER TABLE DROP PARTITION.

Consideraciones y limitaciones

Al utilizar MSCK REPAIR TABLE, tenga en cuenta los siguientes puntos:

  • Es posible que tarde un tiempo en añadir todas las particiones. Si esta operación agota el tiempo de espera, se encontrará en un estado incompleto en el que solo se habrán añadido unas cuantas particiones al catálogo. Debe ejecutar MSCK REPAIR TABLE en la misma tabla hasta que se hayan agregado todas las particiones. Para obtener más información, consulte Particiones de datos en Athena.

  • En el caso de las particiones que no son compatibles con Hive, utilice ALTER TABLE ADD PARTITION para cargar las particiones de modo que pueda consultar los datos.

  • Las ubicaciones de partición que se van a utilizar con Athena deben utilizar el protocolo s3 (por ejemplo, s3://DOC-EXAMPLE-BUCKET/folder/). En Athena, las ubicaciones que utilizan otros protocolos (por ejemplo, s3a://bucket/folder/) producirán errores de consulta cuando se ejecuten consultas MSCK REPAIR TABLE en las tablas que contienen.

  • Dado que MSCK REPAIR TABLE analiza una carpeta y sus subcarpetas para encontrar un esquema de partición coincidente, asegúrese de mantener los datos de tablas separadas en jerarquías de carpetas separadas. Por ejemplo, supongamos que tiene los datos de la tabla 1 en s3://DOC-EXAMPLE-BUCKET1 y los datos de la tabla 2 en s3://DOC-EXAMPLE-BUCKET1/table-2-data. Si ambas tablas están particionadas por cadena, MSCK REPAIR TABLE agregará las particiones de la tabla 2 a la tabla 1. Para evitarlo, utilice estructuras de carpetas independientes, como s3://DOC-EXAMPLE-BUCKET1 y s3://DOC-EXAMPLE-BUCKET2 en su lugar. Tenga en cuenta que este comportamiento es coherente con Amazon EMR y Apache Hive.

  • Debido a un problema conocido, MSCK REPAIR TABLE falla silenciosamente cuando los valores de partición contienen el carácter de dos puntos (:) (por ejemplo, cuando el valor de la partición es una marca de tiempo). Como alternativa, utilice ALTER TABLE ADD PARTITION.

  • MSCK REPAIR TABLE no agrega nombres de columnas de particiones que comiencen por un carácter de guion bajo (_). Para evitar este límite, utilice ALTER TABLE ADD PARTITION.

Sinopsis

MSCK REPAIR TABLE table_name

Ejemplos

MSCK REPAIR TABLE orders;

Resolución de problemas

Después de ejecutar MSCK REPAIR TABLE, si Athena no agrega las particiones a la tabla en AWS Glue Data Catalog, verifique lo siguiente:

  • Acceso a AWS Glue: asegúrese de que el rol de AWS Identity and Access Management (IAM) tenga una política que permita la acción glue:BatchCreatePartition. Para obtener más información, consulte Permitir glue:BatchCreatePartition en la política de IAM más adelante en este documento.

  • Acceso a Amazon S3: asegúrese de que el rol tenga una política con permisos suficientes para acceder a Amazon S3, incluida la acción s3:DescribeJob. Para obtener un ejemplo de las acciones de Amazon S3 que debe permitir, consulte el ejemplo de política de bucket en Acceso entre cuentas en Athena a los buckets de Simple Storage Service (Amazon S3).

  • Mayúsculas en las claves de objeto en Amazon S3: asegúrese de que la ruta de Amazon S3 esté escrita en minúsculas en lugar de una combinación de mayúsculas y minúsculas (por ejemplo, userid en lugar de userId) o use ALTER TABLE ADD PARTITION para especificar los nombres de las claves de objeto. Para obtener más información, consulte Cambiar o redefinir la ruta de Amazon S3 más adelante en este documento.

  • Tiempos de espera de consulta: MSCK REPAIR TABLE se utiliza mejor al crear una tabla por primera vez o cuando hay incertidumbre acerca de la paridad entre los datos y los metadatos de partición. Si utiliza MSCK REPAIR TABLE para agregar particiones nuevas con frecuencia (por ejemplo, a diario) y experimentan tiempos de espera de consulta, considere usar ALTER TABLE ADD PARTITION.

  • Faltan particiones en el sistema de archivos: si elimina una partición de forma manual en Amazon S3 y, a continuación, ejecuta MSCK REPAIR TABLE, puede recibir el mensaje de error Faltan particiones en el sistema de archivos. Esto sucede porque MSCK REPAIR TABLE no elimina particiones obsoletas de los metadatos de la tabla. Para quitar las particiones eliminadas de los metadatos de la tabla, ejecute ALTER TABLE DROP PARTITION en su lugar. Tenga en cuenta que SHOW PARTITIONS (Mostrar particiones) muestra de manera similar solo las particiones en los metadatos, no las particiones en el sistema de archivos.

  • Error “NullPointerException name is null” (El nombre NullPointerException es nulo)

    Si utiliza la operación de la API CreateTable de AWS Glue o la plantilla AWS::Glue::Table de AWS CloudFormation para crear una tabla para su uso en Athena sin especificar la propiedad TableType, y luego ejecuta una consulta DDL como SHOW CREATE TABLE o MSCK REPAIR TABLE, puede recibir el mensaje de error FAILED: NullPointerException Name is null (ERROR: el nombre NullPointerException es nulo).

    Para resolver el error, especifique un valor para el atributo TableType TableInput como parte de la llamada a la API CreateTable de AWS Glue o la plantilla AWS CloudFormation. Entre los valores posibles para TableType, se incluyen EXTERNAL_TABLE o VIRTUAL_VIEW.

    Este requisito se aplica únicamente cuando se crea una tabla mediante la operación de la API CreateTable de AWS Glue o la plantilla AWS::Glue::Table. Si crea una tabla para Athena mediante una instrucción DDL o un rastreador de AWS Glue, la propiedad TableType se define automáticamente.

Las secciones siguientes proporcionan algunos detalles adicionales.

Permitir glue:BatchCreatePartition en la política de IAM

Revise las políticas de IAM asociadas al rol que utiliza para ejecutar MSCK REPAIR TABLE. Cuando utiliza AWS Glue Data Catalog con Athena, la política de IAM debe permitir la acción glue:BatchCreatePartition. Para obtener un ejemplo de una política de IAM que permita la acción glue:BatchCreatePartition, consulte Política administrada de AWS: AmazonAthenaFullAccess.

Cambiar o redefinir la ruta de Amazon S3

Si una o más claves de objeto de la ruta de Amazon S3 están en mayúsculas y minúsculas y no solo en minúsculas, MSCK REPAIR TABLE podría no agregar las particiones a AWS Glue Data Catalog. Por ejemplo, si la ruta de Amazon S3 incluye el nombre de la clave del objeto userId, es posible que las siguientes particiones no se agreguen al AWS Glue Data Catalog:

s3://DOC-EXAMPLE-BUCKET/path/userId=1/ s3://DOC-EXAMPLE-BUCKET/path/userId=2/ s3://DOC-EXAMPLE-BUCKET/path/userId=3/

Para resolver este problema, siga uno de estos pasos:

  • Utilice minúsculas en lugar de una combinación de mayúsculas y minúsculas cuando cree las claves de objeto de Amazon S3:

    s3://DOC-EXAMPLE-BUCKET/path/userid=1/ s3://DOC-EXAMPLE-BUCKET/path/userid=2/ s3://DOC-EXAMPLE-BUCKET/path/userid=3/
  • Use ALTER TABLE ADD PARTITION para redefinir la ubicación, como en el siguiente ejemplo:

    ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION (userId=1) LOCATION 's3://DOC-EXAMPLE-BUCKET/path/userId=1/' PARTITION (userId=2) LOCATION 's3://DOC-EXAMPLE-BUCKET/path/userId=2/' PARTITION (userId=3) LOCATION 's3://DOC-EXAMPLE-BUCKET/path/userId=3/'

Tenga en cuenta que, aunque los nombres de las claves de objeto de Amazon S3 pueden estar en mayúsculas, los nombres de los buckets de Amazon S3 deben estar siempre en minúsculas. Para obtener más información, consulte las pautas de nomenclatura de claves de objeto y las reglas de nomenclatura de buckets en la Guía del usuario de Amazon S3.