Creación de particiones y asignación de buckets en Athena - Amazon Athena

Creación de particiones y asignación de buckets en Athena

La creación de particiones y la asignación de buckets son dos formas de reducir la cantidad de datos que Athena debe analizar al ejecutar una consulta. La creación de particiones y la asignación de buckets son complementarias y se pueden utilizar juntas. Reducir la cantidad de datos analizados mejora el rendimiento y reduce los costos. Para obtener pautas generales sobre el rendimiento de las consultas de Athena, consulte Top 10 performance tuning tips for Amazon Athena (Los 10 mejores consejos para ajustar el rendimiento de Amazon Athena).

¿Qué es la creación de particiones?

Crear particiones significa organizar los datos en directorios (o “prefijos”) en Amazon S3 en función de una propiedad concreta de los datos. Estas propiedades se denominan claves de partición. Una clave de partición común es la fecha o alguna otra unidad de tiempo, como el año o el mes. Sin embargo, un conjunto de datos se puede particionar en más de una clave. Por ejemplo, los datos sobre las ventas de productos pueden particionarse por fecha, categoría de producto y mercado.

Decidir cómo crear particiones

Las propiedades que se utilizan siempre o con frecuencia en las consultas y que tienen una cardinalidad baja son buenas candidatas para las claves de partición. Hay una disyuntiva entre tener demasiadas particiones y tener muy pocas. Con demasiadas particiones, el aumento del número de archivos genera una sobrecarga. El filtrado de las propias particiones también supone una sobrecarga. Con muy pocas particiones, las consultas suelen tener que analizar más datos.

Creación de una tabla particionada

Cuando un conjunto de datos está particionado, puede crear una tabla particionada en Athena. Una tabla particionada es una tabla que tiene claves de partición. Cuando se utiliza CREATE TABLE, se agregan particiones a la tabla. Cuando se utiliza CREATE TABLE AS, las particiones que se crean en Amazon S3 se agregan automáticamente a la tabla.

En una instrucción CREATE TABLE, se especifican las claves de partición en la cláusula PARTITIONED BY (column_name data_type). En una instrucción CREATE TABLE AS, se especifican las claves de partición en una cláusula WITH (partitioned_by = ARRAY['partition_key']) o WITH (partitioning = ARRAY['partition_key']) en las tablas de Iceberg. Por motivos de rendimiento, las claves de partición siempre deben ser del tipo STRING. Para obtener más información, consulte Uso de una cadena como tipo de datos para las claves de partición.

Para obtener información adicional sobre la sintaxis de CREATE TABLE y CREATE TABLE AS, consulte CREATE TABLE y Propiedades de la tabla CTAS.

Consulta de tablas particionadas

Cuando se consulta una tabla particionada, Athena usa los predicados de la consulta para filtrar la lista de particiones. A continuación, utiliza las ubicaciones de las particiones coincidentes para procesar los archivos encontrados. Athena puede reducir de manera eficiente la cantidad de datos analizados simplemente al no leer los datos de las particiones que no coinciden con los predicados de la consulta.

Ejemplos

Supongamos que tiene una tabla particionada en sales_date y product_category y quiere saber los ingresos totales de una semana en una categoría específica. Debe incluir predicados en las columnas sales_date y product_category para garantizar que Athena analice solo la cantidad mínima de datos, como en el siguiente ejemplo.

SELECT SUM(amount) AS total_revenue FROM sales WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' AND product_category = 'Toys'

Supongamos que tiene un conjunto de datos que está particionado por fecha, pero que también tiene una marca de tiempo detallada.

Con las tablas de Iceberg, puede declarar que una clave de partición tiene una relación con una columna, pero con las tablas de Hive, el motor de consultas no conoce las relaciones entre las columnas y las claves de partición. Por este motivo, debe incluir un predicado tanto en la columna como en la clave de partición de la consulta para asegurarse de que la consulta no analice más datos de los necesarios.

Por ejemplo, supongamos que la tabla sales del ejemplo anterior también tiene una columna sold_at del tipo de datos TIMESTAMP. Si desea obtener los ingresos solo para un intervalo de tiempo específico, debe escribir la consulta de la siguiente manera:

SELECT SUM(amount) AS total_revenue FROM sales WHERE sales_date = '2023-02-28' AND sold_at BETWEEN TIMESTAMP '2023-02-28 10:00:00' AND TIMESTAMP '2023-02-28 12:00:00' AND product_category = 'Toys'

Para obtener más información sobre esta diferencia entre las consultas de las tablas de Hive e Iceberg, consulte Cómo escribir consultas para campos de marca de tiempo que también se encuentren particionados por tiempo.

¿Qué es la asignación de buckets?

La asignación de buckets es una forma de organizar los registros de un conjunto de datos en categorías denominadas buckets.

Este significado de bucket y creación de buckets es diferente del de bucket de Amazon S3 y no debe confundirse con este. En la asignación de buckets para datos, los registros que tienen el mismo valor para una propiedad se incluyen en el mismo bucket. Los registros se distribuyen de la forma más uniforme posible entre los buckets, de modo que cada uno de ellos tenga aproximadamente la misma cantidad de datos.

En la práctica, los buckets son archivos y una función hash determina el bucket al que se asigna un registro. Un conjunto de datos agrupado en buckets tendrá uno o más archivos por bucket y partición. El bucket al que pertenece un archivo está codificado en el nombre del archivo.

Beneficios de la asignación de buckets

La asignación de buckets es útil cuando un conjunto de datos está agrupado en buckets según una propiedad específica y se desean recuperar registros en los que esa propiedad tiene un valor determinado. Como los datos están agrupados en buckets, Athena puede utilizar el valor para determinar los archivos que se van a examinar. Por ejemplo, supongamos que un conjunto de datos está agrupado en buckets por customer_id y que usted desea buscar todos los registros de un cliente específico. Athena determina el bucket que contiene esos registros y solo lee los archivos de ese bucket.

Las columnas que presentan una alta cardinalidad (es decir, tienen muchos valores distintos), están distribuidas de manera uniforme y se consultan en busca de valores específicos con frecuencia, se consideran buenas candidatas para la asignación de datos.

nota

Athena no admite el uso de INSERT INTO para agregar nuevos registros a tablas agrupadas en buckets.

Tipos de datos admitidos para filtrado en columnas en buckets

Puede agregar filtros en columnas agrupadas en buckets con determinados tipos de datos. Athena admite el filtrado en columnas agrupadas en buckets con los siguientes tipos de datos:

  • BOOLEAN

  • BYTE

  • FECHA

  • DOUBLE

  • FLOAT

  • INT

  • LONG

  • SHORT

  • STRING

  • VARCHAR

Soporte para Hive y Spark

La versión 2 del motor de Athena admite conjuntos de datos agrupados en buckets mediante el algoritmo de bucket Hive, y la versión 3 del motor de Athena también admite el algoritmo de bucket Apache Spark. Hive es el bucket predeterminado. Si el conjunto de datos está agrupado en buckets mediante el algoritmo Spark, use la cláusula TBLPROPERTIES para establecer el valor de la propiedad bucketing_format en spark.

nota

Athena tiene un límite de 100 particiones por consulta CREATE TABLE AS SELECT (CTAS). Del mismo modo, solo puede agregar un máximo de 100 particiones a una tabla de destino con una instrucción INSERT INTO. Este límite de 100 solo se aplica cuando la tabla está agrupada en buckets además de particionada.

Si supera esta limitación, es posible que reciba el mensaje de error HIVE_TOO_MANY_OPEN_PARTITIONS: Exceeded limit of 100 open writers for partitions/buckets (HIVE_TOO_MANY_OPEN_PARTITIONS: Se ha superado el límite de 100 autores abiertos para particiones/buckets). Para evitar esta limitación, puede utilizar una instrucción CTAS y una serie de instrucciones INSERT INTO que crean o insertan hasta 100 particiones cada una. Para obtener más información, consulte Uso de CTAS e INSERT INTO para evitar el límite de 100 particiones.

Ejemplo de asignación de buckets con CREATE TABLE

Si desea crear una tabla para un conjunto de datos agrupado en buckets existente, use la cláusula CLUSTERED BY (column) seguida de la cláusula INTO N BUCKETS. La cláusula INTO N BUCKETS especifica el número de buckets en los que se agrupan los datos.

En el siguiente ejemplo CREATE TABLE, el conjunto de datos sales se agrupa por customer_id en 8 buckets mediante el algoritmo Spark. La instrucción CREATE TABLE usa las cláusulas CLUSTERED BY y TBLPROPERTIES para establecer las propiedades en consecuencia.

CREATE EXTERNAL TABLE sales (...) ... CLUSTERED BY (`customer_id`) INTO 8 BUCKETS ... TBLPROPERTIES ( 'bucketing_format' = 'spark' )

Ejemplo de asignación de buckets con CREATE TABLE AS (CTAS)

Para especificar la asignación de buckets con CREATE TABLE AS, utilice los parámetros bucketed_by y bucket_count, como en el siguiente ejemplo.

CREATE TABLE sales WITH ( ... bucketed_by = ARRAY['customer_id'], bucket_count = 8 ) AS SELECT ...

Ejemplo de consulta de asignación de buckets

En el siguiente ejemplo de consulta, se buscan los nombres de los productos que un cliente específico ha comprado en el transcurso de una semana.

SELECT DISTINCT product_name FROM sales WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' AND customer_id = 'c123'

Si esta tabla está particionada por sales_date y agrupada en buckets por customer_id, Athena puede calcular el bucket en el que se encuentran los registros del cliente. Como máximo, Athena lee un archivo por partición.

Véase también

Para ver un ejemplo de CREATE TABLE AS en el que se crean tablas agrupadas en buckets y particionadas, consulte Ejemplo: creación de tablas agrupadas en buckets y particionadas.