Creación de índices de particiones - AWS Adherencia

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.

Creación de índices de particiones

Con el tiempo, cientos de miles de particiones se agregan a una tabla. El GetPartitions APIse usa para buscar las particiones de la tabla. APIDevuelve las particiones que coinciden con la expresión proporcionada en la solicitud.

Tomemos como ejemplo una tabla sales_data que está dividida por las claves Country, Category, Year, Month y. creationDate Si desea obtener datos de ventas de todos los artículos vendidos en la categoría Libros en el año 2020 después del 15 de agosto de 2020, debe realizar una GetPartitions solicitud al catálogo de datos con la expresión «Categoría = 'Libros' y creationDate > '15 de agosto de 2020'».

Si no hay índices de partición presentes en la tabla, AWS Glue carga todas las particiones de la tabla y, a continuación, filtra las particiones cargadas con la expresión de consulta proporcionada por el usuario en la solicitud GetPartitions. La consulta tarda más tiempo en ejecutarse a medida que aumenta el número de particiones en una tabla sin índices. Con un índice, la consulta GetPartitions intentará obtener un subconjunto de las particiones en lugar de cargar todas las particiones en la tabla.

Acerca de los índices de partición

Cuando crea un índice de partición, especifica una lista de claves de partición que ya existen en una tabla determinada. El índice de partición es una sublista de claves de partición definidas en la tabla. Se puede crear un índice de partición en cualquier permutación de claves de partición definidas en la tabla. Para la tabla sales_data anterior, los índices posibles son (país, categoría,creationDate), (país, categoría, año), (país, categoría), (país), (categoría, país, año, mes), etc.

El Data Catalog concatenará los valores de partición en el orden proporcionado en el momento de la creación del índice. El índice se genera de forma continua a medida que se agregan particiones a la tabla. Los índices pueden crearse para los tipos de columna Cadena (string, char y varchar), Numérico (int, biging, long, tinyint y smallint) y Fecha (aaaa-mm-dd).

Tipos de datos compatibles

  • Fecha: una fecha en ISO formato, por ejemplo. YYYY-MM-DD Por ejemplo, la fecha 2020-08-15. El formato utiliza guiones (‐) para separar el año, el mes y el día. El rango de fechas admitido para los lapsos de indexación es de 0000-01-01 a 9999-12-31.

  • Cadena: un literal de cadena entre comillas simples o dobles.

  • Char: datos de caracteres de longitud fija, con una longitud especificada comprendida entre 1 y 255 como, por ejemplo, char(10).

  • Varchar: datos de caracteres de longitud variable, con una longitud especificada comprendida entre 1 y 65 535 como, por ejemplo, varchar(10).

  • Numérico: int, bigint, long, tinyint y smallint

Los índices para los tipos de datos Numérico, Cadena y Fecha admiten el uso de los símbolos =, >, >=, < y <= entre los operadores. La solución de indexación actualmente solo admite el operador lógico AND. Las subexpresiones con los operadores "LIKE«, «IN», «OR» y "NOT" se omiten en la expresión para filtrarlas mediante un índice. El filtrado de la subexpresión ignorada se realiza en las particiones obtenidas después de aplicar el filtrado de índices.

Para cada partición agregada a una tabla, se crea elemento de índice correspondiente. Para una tabla con particiones “n”, un índice de partición dará como resultado elementos de índice de partición “n”. El índice de partición “m” en la misma tabla dará como resultado elementos de índice de partición “m*n”. Cada elemento del índice de partición se cargará de acuerdo con la política de precios actual de AWS Glue para el almacenamiento del catálogo de datos. Para obtener detalles sobre el precio de los objetos de almacenamiento, consulte Precios de AWS Glue.

Creación de una tabla con índices de partición

Puede crear un índice de partición durante la creación de la tabla. La solicitud CreateTable toma una lista de objetos de PartitionIndex como entrada. Se puede crear un máximo de 3 índices de partición en una tabla determinada. Cada índice de partición requiere un nombre y una lista de partitionKeys definida para la tabla. Los índices creados en una tabla se pueden obtener mediante el GetPartitionIndexesAPI

Agregado de un índice de partición a una tabla existente

Para agregar un índice de partición a una tabla existente, se usa la operación CreatePartitionIndex. Puede crear un PartitionIndex por cada operación CreatePartitionIndex. Agregar un índice no afecta la disponibilidad de una tabla, ya que la tabla sigue estando disponible mientras se crean los índices.

El estado del índice de una partición agregada se establece en CREATING y se inicia la creación de los datos del índice. Si el proceso de creación de los índices es correcto, se actualiza ACTIVE y, en el indexStatus caso de un proceso incorrecto, el estado del índice se actualiza aFAILED. La creación del índice puede presentar errores por varias razones, y puede usar la función GetPartitionIndexes para recuperar los detalles del error. Los posibles errores son:

  • ENCRYPTED_ PARTITION _ ERROR — No se admite la creación de índices en una tabla con particiones cifradas.

  • INVALID_ PARTITION _ TYPE _ DATA _ ERROR — Se observa cuando el partitionKey valor no es un valor válido para el tipo de partitionKey datos correspondiente. Por ejemplo: una partitionKey con el tipo de datos “int” tiene un valor “foo”.

  • MISSING_ PARTITION _ VALUE _ ERROR — Se observa cuando partitionValue la forma an no indexedKey está presente. Esto puede suceder cuando una tabla no se particiona de manera uniforme.

  • UNSUPPORTED_ _ PARTITION CHARACTER _ ERROR — Se observa cuando el valor de una clave de partición indexada contiene los caracteres\ u0000,\ u0001 o\ u0002

  • INTERNAL_ ERROR — Se produjo un error interno mientras se creaban los índices.

Descripción de índices de partición en una tabla

Para obtener los índices de partición creados en una tabla, utilice la operación GetPartitionIndexes. La respuesta enumera todos los índices de la tabla, junto con el estado actual de cada uno de ellos (el IndexStatus).

El IndexStatus para un índice de partición será uno de los siguientes:

  • CREATING: el índice está en proceso de creación y aún no está disponible para usarlo.

  • ACTIVE: ya se puede utilizar el índice. Las solicitudes pueden utilizar el índice para realizar una consulta optimizada.

  • DELETING: el índice se está eliminando y ya no se puede utilizar. Se puede eliminar un índice en estado activo mediante la DeletePartitionIndex solicitud, que mueve el estado de ACTIVE aDELETING.

  • FAILED: error en la creación del índice en una tabla existente. Cada tabla almacena los últimos 10 índices que presentaron errores.

Las transiciones de estado posibles para los índices creados en una tabla existente son:

  • CREATING → ACTIVE → DELETING

  • CREATING → FAILED

Limitaciones al uso de índices de partición

Una vez que haya creado un índice de partición, tenga en cuenta estos cambios en la funcionalidad de la tabla y la partición:

Creación de una nueva partición (después del agregado de índices)

Después de crear un índice de partición en una tabla, se validarán las comprobaciones de tipos de datos de claves indexadas de todas las particiones nuevas agregadas a la tabla. Se validará el formato de tipo de datos del valor de partición de las claves indexadas. Si se produce un error en la comprobación del tipo de datos, la operación de creación de partición fallará. En la tabla sales_data, si se crea un índice para claves (categoría, año) en el que la categoría es del tipo string y el año del tipoint, no se podrá crear la nueva partición con el valor «foo». YEAR

Una vez habilitados los índices, el agregado de particiones con valores clave indexados que tengan los caracteres U+0000, U+00001 y U+0002 comenzará a fallar.

Actualizaciones de tablas

Una vez creado un índice de partición en una tabla, no puede modificar los nombres de las claves de partición para las claves de partición existentes y no puede cambiar el tipo o el orden de las claves que están registradas con el índice.

Uso de índices para una llamada optimizada GetPartitions

Cuando llame GetPartitions en una tabla con un índice, puede incluir una expresión y, si corresponde, el Data Catalog utilizará un índice si es posible. La primera clave del índice debe ser transferida a la expresión para los índices que se van a utilizar en el filtrado. La optimización de índices en el filtrado se aplica en la medida de lo posible. El Data Catalog intenta utilizar la optimización del índice tanto como sea posible, pero en caso de que falte un índice o en caso de un operador no soportado, vuelve a la implementación existente de cargar todas las particiones.

Para la tabla sales_data (datos de venta) anterior, agregaremos el índice [Country (País), Category (Categoría), Year (Año)]. Si “País” no se transfiere en la expresión, el índice registrado no podrá filtrar particiones utilizando índices. Puede agregar hasta 3 índices para soportar varios patrones de consulta.

Tomemos algunas expresiones de ejemplo y veamos cómo funcionan los índices en ellas:

Expressions Cómo se utilizará el índice

Country = 'US' (País = “EE.UU.”)

El índice se utilizará para filtrar particiones.

Country = 'US' (País = “EE.UU.”) y Category = 'Shoes' (Categoría = ”Zapatos”)

El índice se utilizará para filtrar particiones.

Category = 'Shoes' (Categoría = “Zapatos”)

Los índices no se utilizarán ya que no se proporciona “país” en la expresión. Todas las particiones se cargarán para devolver una respuesta.

Country = 'US' (País = “EE.UU.”) y Category = 'Shoes' (Categoría = ”Zapatos”) y Year > '2018' (Año > “2018”)

El índice se utilizará para filtrar particiones.

Country = 'US' (País = “EE.UU.”) y Category = 'Shoes' (Categoría = ”Zapatos”) y Year > '2018' (Año > “2018”) y month = 2 (mes = 2)

El índice se utilizará para buscar todas las particiones con país = “EE.UU.” y categoría = “zapatos” y año > 2018. A continuación, se realizará el filtrado en la expresión del mes.

País = «EE. UU.» AND Categoría = «Zapatos» O Año > «2018»

Los índices no se usarán ya que se incluye un operador OR en la expresión.

País = «EE. UU.» AND Categoría = «Zapatos» AND (año = 2017 o año = «2018»)

El índice se utilizará para buscar todas las particiones con país = “EE.UU.” y categoría = “zapatos”, y luego se realizará el filtrado en la expresión del año.

País en la AND categoría («EE. UU.», «Reino Unido») = «Zapatos»

Los índices no se usarán para filtrar ya que el operador IN no se soporta actualmente.

País = «EE. UU.» AND Categoría en («Zapatos», «Libros»)

El índice se utilizará para buscar todas las particiones con país = “EE.UU.” y luego se realizará el filtrado en la expresión de la categoría.

País = «EE. UU.» AND Categoría en («Zapatos», «Libros») AND (creationDate > «2023-9-01»

El índice se utilizará para buscar todas las particiones con country = «US», con creationDate > '2023-9-01' y, a continuación, se filtrará por la expresión de categoría.

Integración con motores

Redshift Spectrum, Amazon EMR y AWS Glue ETL Spark DataFrames pueden utilizar índices para recuperar particiones después de que los índices estén en un estado. ACTIVE AWS Glue Los marcos Athena y AWS Glue ETL Dynamic requieren que siga pasos adicionales para utilizar los índices y mejorar las consultas.

Habilitación del filtrado de particiones

Para habilitar el filtrado de particiones, se necesita actualizar las propiedades de la tabla tal como se muestra a continuación:

  1. En la AWS Glue consola, en Catálogo de datos, seleccione Tablas.

  2. Elija una tabla.

  3. En Acciones, seleccione Editar tabla.

  4. En Propiedades de la tabla, agregue lo siguiente:

    • Clave: partition_filtering.enabled

    • Valor: true

  5. Seleccione Apply.

Como alternativa, puede establecer este parámetro ejecutando una ALTERTABLESETPROPERTIESconsulta en Athena.

ALTER TABLE partition_index.table_with_index SET TBLPROPERTIES ('partition_filtering.enabled' = 'true')