Creación de índices de particiones
Con el tiempo, cientos de miles de particiones se agregan a una tabla. La API GetPartitions se utiliza para buscar las particiones en la tabla. La API devuelve las particiones que coinciden con la expresión proporcionada en la solicitud.
Utilicemos, a modo de ejemplo, una tabla sales_data (datos de servicio), la cual está dividida en las secciones Country (País), Category (Categoría), Year (Año), Month (Mes) y creationDate (Fecha de creación). Para obtener los datos de ventas de todos los objetos que se vendieron en la categoría Books (Libros) durante el 2020, después del 2020-08-15, tiene que crear una solicitud de GetPartitions
con la expresión “Category = ‘Books’ and creationDate > ‘2020-08-15’” en el catálogo de datos.
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.
Temas
- Acerca de los índices de partición
- Creación de una tabla con índices de partición
- Agregado de un índice de partición a una tabla existente
- Descripción de índices de partición en una tabla
- Limitaciones al uso de índices de partición
- Uso de índices para una llamada GetPartitions optimizada
- Integración con motores
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, fecha de creación), (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 el formato ISO, como
YYYY-MM-DD
. Por ejemplo, la fecha2020-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 de0000-01-01
a9999-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 (COMO)”, “IN (EN)”, “OR (O)” y “NOT (NO)” se ignoran en la expresión para el filtrado mediante í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 recuperar con la API GetPartitionIndexes
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 para una partición agregada se establece en CREATING (CREACIÓN) y se inicia la creación de los datos del índice. Si el proceso de creación de los índices se realiza correctamente, el estado del índice se actualiza a ACTIVE (ACTIVO) y, en caso de que el proceso no se realice correctamente, el estado del índice se actualiza a FAILED (ERROR). 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_PARTITITION_ERROR (ERROR DE PARTICICÓN CIFRADA): no se admite la creación de índices en una tabla con particiones cifradas.
INVALID_PARTITITION_TYPE_DATA_ERROR (ERROR DE DATOS DE TIPO DE PARTICIÓN INVÁLIDOS): se observa cuando el valor
partitionKey
no es un valor válido para el tipo de datospartitionKey
correspondiente. Por ejemplo: unapartitionKey
con el tipo de datos “int” tiene un valor “foo”.MISSING_PARTITITION_VALUE_ERROR (ERROR DE VALOR DE PARTICIÓN FALTANTE): se observa cuando el
partitionValue
para unaindexedKey
no está presente. Esto puede suceder cuando una tabla no se particiona de manera uniforme.UNSUPPORTED_PARTITITION_CARACTER_ERROR (ERROR DE CARÁCTER DE PARTICIÓN NO SOPORTADO): se observa cuando el valor de una clave de partición indexada contiene los caracteres \u0000, \u0001 o \u0002
INTERNAL_ERROR (ERROR INTERNO): 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. Un índice en el estado activo se puede eliminar mediante la solicitudDeletePartitionIndex
, que mueve el estado de ACTIVE (ACTIVO) a DELETING (ELIMINACIÓN).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:
CREACIÓN → ACTIVO → ELIMINACIÓN
CREACIÓN → ERROR
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á. Para la tabla sales_data (datos de venta), si se crea un índice para claves (categoría, año) donde la categoría es de tipo string
y año del tipo int
, la creación de la nueva partición con un valor de YEAR (AÑO) de “foo” presentará errores.
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 GetPartitions optimizada
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.” Y Categoría = ”Zapatos” O Año > “2018” |
Los índices no se usarán ya que se incluye un operador |
País = “EE.UU.” Y Categoría = “Zapatos” Y (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 (“EE.UU.”, “UK”) Y Categoría = “Zapatos” |
Los índices no se usarán para filtrar ya que el operador |
País = “EE.UU.”, Y 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.’ Y Categoría en (‘Zapatos’, ’Libros’) Y (Fecha de creación > ‘2023-9-01’ |
El índice se utilizará para buscar todas las particiones con País = ‘EE. UU.’ y Fecha de creación > ‘2023-9-01’ y luego se realizará el filtrado en la expresión de la Categoría. |
Integración con motores
Redshift Spectrum, Amazon EMR y AWS Glue ETL Spark DataFrames pueden utilizar índices para obtener particiones después de que los índices estén en estado ACTIVE en AWS Glue. Athena y los AWS Glue marcos dinámicos de ETL requieren que siga pasos adicionales si desea utilizar índices para 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:
En la consola de AWS Glue, en la sección Catálogo de datos, seleccione Tablas.
Elija una tabla.
En Acciones, seleccione Editar tabla.
En Propiedades de la tabla, agregue lo siguiente:
Clave:
partition_filtering.enabled
Valor:
true
Seleccione Apply.
Como alternativa, puede establecer este parámetro al ejecutar la consulta ALTER TABLE SET PROPERTIES (Alterar las propiedades establecidas de la tabla) en Athena.
ALTER TABLE partition_index.table_with_index SET TBLPROPERTIES ('partition_filtering.enabled' = 'true')