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

Creación de buckets y división en particiones

Puede elegir entre crear particiones o asignar buckets para almacenar los datos de los resultados de las consultas CTAS en Amazon S3. Para obtener más información acerca de las consultas CTAS, consulte CREATE TABLE AS SELECT (CTAS).

En esta sección se explican los conceptos de creación de particiones y asignación de buckets únicamente para la consultas CTAS. Para obtener lineamientos generales sobre la división en particiones en las consultas CREATE TABLE, consulte Top performance tuning tips for Amazon Athena (Consejos principales para el ajuste de rendimiento de Amazon Athena).

Utilice las siguientes sugerencias para decidir si debe crear particiones o asignar buckets, y para seleccionar columnas en su consultas CTAS, en función de lo que vaya a hacer:

  • Particionar los resultados de las consultas CTAS es una opción adecuada cuando el número de particiones previsto es limitado. Cuando ejecuta una consulta CTAS, Athena escribe los resultados en una ubicación especificada de Amazon S3. Si especifica particiones, las crea y almacena cada partición en una carpeta de partición distinta en la misma ubicación. El número máximo de particiones que puede configurar con resultados de consultas CTAS en una consulta es 100. Sin embargo, puede evitar esta limitación. Para obtener más información, consulte Uso de CTAS e INSERT INTO para crear una tabla con más de 100 particiones .

    Las particiones en Amazon S3 mejoran el rendimiento de las consultas de Athena, ya que ayudan a ejecutar consultas específicas solo para determinadas particiones. A continuación, Athena analiza únicamente esas particiones, lo que le permite ahorrar costos y tiempo de consulta. Para obtener más información acerca de la sintaxis de las particiones, busque partitioned_by en CREATE TABLE AS.

    Particione los datos por aquellas columnas que tengan características similares, como los registros del mismo departamento, y que puedan tener un número limitado de valores posibles, como un número limitado de departamentos diferentes de una organización. Esta característica se denomina cardinalidad de los datos. Por ejemplo, si particiona por la columna department y esta columna tiene un número limitado de valores distintos, la partición por department funcionará bien y reducirá la latencia de las consultas.

  • La asignación de buckets para los resultados de las consultas CTAS funciona bien cuando asigna buckets a los datos por una columna que tiene una alta cardinalidad y valores distribuidos de manera uniforme.

    Por ejemplo, las columnas que contienen datos timestamp podrían tener un gran número de valores distintos, con datos distribuidos de manera uniforme entre el conjunto de datos. Esto significa que una columna que almacene datos del tipo timestamp tendrá probablemente valores y no tendrá valores null. Esto significa también que los datos de este tipo de columna se pueden colocar en muchos buckets, cada uno con aproximadamente la misma cantidad de datos almacenados en Amazon S3.

    Para elegir la columna por la que se asignan buckets a los resultados de las consultas CTAS, utilice la columna que tenga un gran número de valores (cardinalidad alta) y cuyos datos se puedan dividir para el almacenamiento en muchos buckets que tengan aproximadamente la misma cantidad de datos. Las columnas escasamente pobladas con valores no son buenas candidatas para la asignación de buckets. Esto se debe a que a la larga acabará con buckets que tengan pocos datos y otros buckets que tengan muchos datos. Por el contrario, las columnas que piense que casi siempre tendrán valores, como valores del tipo timestamp, serán buenas candidatas para la asignación de buckets. Esto se debe a que sus datos tiene una cardinalidad alta y se pueden almacenar en fragmentos prácticamente iguales.

    Para obtener más información acerca de la sintaxis de asignación de buckets, busque bucketed_by en CREATE TABLE AS.

En definitiva, puede crear particiones y asignar buckets para almacenar los resultados de la misma consulta CTAS. Estas técnicas para escribir datos no son mutuamente excluyentes. Normalmente, las columnas que utiliza para la asignación de buckets son diferentes de las que utiliza para la creación de particiones.

Por ejemplo, si su conjunto de datos tiene columnas department, sales_quarter, y customer_id (tipo entero), puede particionar los resultados de las consultas CTAS por department y sales_quarter. Estas columnas tienen relativamente baja cardinalidad de valores: un número limitado de departamentos y trimestres de ventas. Además, en el caso de las particiones, da igual si algunos registros del conjunto de datos tienen valores null o no tienen valores asignados para estas columnas. Lo que importa es que los datos con las mismas características, por ejemplo, los datos del mismo departamento, estén en una partición que puede consultar en Athena.

Además, como todos los datos tienen valores del tipo entero almacenados en la columna customer_id, puede configurar la asignación de buckets para los mismos resultados de la consulta por la columna customer_id. Esta columna tiene cardinalidad alta. Puede almacenar sus datos en más de un bucket en Amazon S3. Consideremos ahora el escenario contrario: si no creara buckets para la columna customer_id y ejecutara una consulta para determinados valores de ID de cliente, tendría que analizar una gran cantidad de datos almacenados en una única ubicación de Amazon S3. Sin embargo, si configura buckets para almacenar los resultados relacionados con el ID, solo puede analizar y consultar los buckets que contengan el valor que busca y, de ese modo, evitar tener que ejecutar consultas de ejecución prolongada que analicen una gran cantidad de datos.

Tipos de datos admitidos para filtrado en columnas en buckets

Es posible reducir la cantidad de datos analizados al agregar filtros en columnas en buckets que tienen determinados tipos de datos. Athena admite dicho filtrado solo en columnas en buckets con los siguientes tipos de datos:

  • TINYINT

  • SMALLINT

  • INT

  • BIGINT

  • BOOLEAN

  • STRING