Partición de datos
La partición de los datos le permite restringir el volumen de datos que explora cada consulta, lo que mejora el rendimiento y reduce los costos. Puede particionar datos por cualquier clave. Una práctica común consiste en particionar los datos en función del tiempo, lo que a menudo conduce a un esquema de partición de varios niveles. Por ejemplo, si un cliente recibe datos cada hora, podría elegir una partición por año, mes, día y hora. Otro cliente, que recibe datos procedentes de muchos orígenes distintos, pero que solo se cargan una vez al día, puede basar la partición en un identificador del origen de datos y en la fecha.
Athena puede utilizar particiones de estilo de Apache Hive, cuyas rutas de datos contienen pares de valores de clave conectados por signos de igual (por ejemplo, country=us/...
o year=2021/month=01/day=26/...
). Por lo tanto, las rutas incluyen los nombres de las claves de partición y los valores que representa cada ruta. Para cargar nuevas particiones de Hive en una tabla particionada, puede utilizar el comando MSCK REPAIR TABLE, que solo funciona con particiones de estilo de Hive.
Athena también puede utilizar esquemas de partición de estilos que no son de Hive. Por ejemplo, los registros de CloudTrail y los flujos de entrega de Firehose utilizan componentes de ruta independientes para partes de fecha, como data/2021/01/26/us/6fc7845e.json
. Para aquellas particiones que no son del estilo de Hive, se utiliza ALTER TABLE ADD PARTITION para agregar las particiones manualmente.
Consideraciones y limitaciones
Al usar la partición, tenga en cuenta los siguientes puntos:
-
Si consulta una tabla con particiones y especifica la partición en la cláusula
WHERE
, Athena analiza los datos solo de esa partición. -
Si efectúa consultas de los buckets de Amazon S3 con un gran número de objetos y los datos no están particionados, dichas consultas pueden afectar los límites de tasa de solicitudes
GET
en Amazon S3 y dar lugar a excepciones de Amazon S3. Para evitar errores, divida los datos. Plantéese también ajustar las tasas de solicitud de Amazon S3. Para obtener más información, consulte Patrones de diseño de prácticas recomendadas: optimización del rendimiento de Amazon S3. -
Las ubicaciones de partición que se van a utilizar con Athena deben utilizar el protocolo
s3
(por ejemplo,s3://amzn-s3-demo-bucket/
). En Athena, las ubicaciones que utilizan otros protocolos (por ejemplo,folder
/s3a://amzn-s3-demo-bucket/
) producirán errores de consulta cuando se ejecuten consultasfolder
/MSCK REPAIR TABLE
en las tablas que contienen. -
Asegúrese de que la ruta de Amazon S3 esté en minúsculas, en lugar de usar también mayúsculas en la inicial (por ejemplo,
userid
en lugar deuserId
). Si la ruta de S3 usa mayúsculas en la inicial,MSCK REPAIR TABLE
no agrega las particiones a AWS Glue Data Catalog. Para obtener más información, consulte MSCK REPAIR TABLE. -
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 ens3://amzn-s3-demo-bucket1
y los datos de la tabla 2 ens3://amzn-s3-demo-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, comos3://amzn-s3-demo-bucket1
ys3://amzn-s3-demo-bucket2
en su lugar. Tenga en cuenta que este comportamiento es coherente con Amazon EMR y Apache Hive. -
Si actualmente utiliza AWS Glue Data Catalog con Athena, consulte los puntos de conexión y cuotas de AWS Glue para ver las cuotas de servicio de las particiones por cuenta y por tabla.
-
Aunque Athena admite consultas de tablas de AWS Glue que tienen 10 millones de particiones, no puede leer más de 1 millón de particiones en un solo escaneo. En estos escenarios, la indexación de particiones puede ser beneficiosa. Para obtener más información, consulte el artículo del Blog de macrodatos de AWS Improve Amazon Athena query performance using AWS Glue Data Catalog partition indexes
.
-
-
Para solicitar un aumento de la cuota de particiones si está utilizando el AWS Glue Data Catalog, vaya a la consola de Service Quotas de AWS Glue
.
Creación y carga de una tabla con datos con particiones
Para crear una tabla que utiliza particiones, utilice la cláusula PARTITIONED BY
de la instrucción CREATE TABLE. La cláusula PARTITIONED BY
define las claves en las que se llevará a cabo la partición de los datos, como en el siguiente ejemplo. La cláusula LOCATION
especifica la ubicación raíz de los datos particionados.
CREATE EXTERNAL TABLE users ( first string, last string, username string ) PARTITIONED BY (id string) STORED AS parquet LOCATION 's3://amzn-s3-demo-bucket'
Después de crear la tabla, cargará los datos en las particiones para poder consultarlos. Para las particiones de estilo Hive, se ejecuta MSCK REPAIR TABLE. Para las particiones que no son del estilo de Hive, se utiliza ALTER TABLE ADD PARTITION para agregar las particiones manualmente.
Preparación de datos de estilo de Hive y no compatibles con Hive para consultas
En las siguientes secciones, se muestra cómo preparar datos de estilo de Hive y no compatibles con Hive para consultas en Athena.
En este escenario, las particiones están almacenadas en Amazon S3 en carpetas distintas. Por ejemplo, esta es una lista parcial de muestras de impresiones de anuncios que genera el comando aws s3 ls
aws s3 ls s3://elasticmapreduce/samples/hive-ads/tables/impressions/
PRE dt=2009-04-12-13-00/ PRE dt=2009-04-12-13-05/ PRE dt=2009-04-12-13-10/ PRE dt=2009-04-12-13-15/ PRE dt=2009-04-12-13-20/ PRE dt=2009-04-12-14-00/ PRE dt=2009-04-12-14-05/ PRE dt=2009-04-12-14-10/ PRE dt=2009-04-12-14-15/ PRE dt=2009-04-12-14-20/ PRE dt=2009-04-12-15-00/ PRE dt=2009-04-12-15-05/
Aquí los registros se almacenan con el nombre de columna (dt) definido según incrementos de fecha, hora y minuto. Cuando se especifica DDL con la ubicación de la carpeta principal, el esquema y el nombre de la columna particionada, Athena puede consultar los datos de las subcarpetas.
Creación de la tabla
Para obtener una tabla de estos datos, cree una partición basada en “dt”, como en la siguiente instrucción DDL de Athena:
CREATE EXTERNAL TABLE impressions ( requestBeginTime string, adId string, impressionId string, referrer string, userAgent string, userCookie string, ip string, number string, processId string, browserCookie string, requestEndTime string, timers struct<modelLookup:string, requestTime:string>, threadId string, hostname string, sessionId string) PARTITIONED BY (dt string) ROW FORMAT serde 'org.apache.hive.hcatalog.data.JsonSerDe' LOCATION 's3://elasticmapreduce/samples/hive-ads/tables/impressions/' ;
Esta tabla utiliza el serializador-deserializador JSON nativo de Hive para leer los datos JSON almacenados en Amazon S3. Para obtener más información acerca de los formatos admitidos, consulte Elección de un valor de SerDe para los datos.
Ejecución de MSCK REPAIR TABLE
Después de ejecutar la consulta CREATE TABLE
, ejecute el comando MSCK
REPAIR TABLE
del editor de consultas de Athena para cargar las particiones, como en el siguiente ejemplo.
MSCK REPAIR TABLE impressions
Cuando ejecuta este comando, los datos están listos para consultarlos.
Consulta de los datos
Consulte los datos de la tabla de impresiones utilizando la columna de partición. A continuación se muestra un ejemplo:
SELECT dt,impressionid FROM impressions WHERE dt<'2009-04-12-14-00' and dt>='2009-04-12-13-00' ORDER BY dt DESC LIMIT 100
La consulta deberá mostrar resultados similares a los siguientes:
2009-04-12-13-20 ap3HcVKAWfXtgIPu6WpuUfAfL0DQEc
2009-04-12-13-20 17uchtodoS9kdeQP1x0XThKl5IuRsV
2009-04-12-13-20 JOUf1SCtRwviGw8sVcghqE5h0nkgtp
2009-04-12-13-20 NQ2XP0J0dvVbCXJ0pb4XvqJ5A4QxxH
2009-04-12-13-20 fFAItiBMsgqro9kRdIwbeX60SROaxr
2009-04-12-13-20 V4og4R9W6G3QjHHwF7gI1cSqig5D1G
2009-04-12-13-20 hPEPtBwk45msmwWTxPVVo1kVu4v11b
2009-04-12-13-20 v0SkfxegheD90gp31UCr6FplnKpx6i
2009-04-12-13-20 1iD9odVgOIi4QWkwHMcOhmwTkWDKfj
2009-04-12-13-20 b31tJiIA25CK8eDHQrHnbcknfSndUk
En el siguiente ejemplo, el comando aws s3 ls
muestra registros de ELB almacenados en Amazon S3. Tenga en cuenta que el diseño de datos no utiliza pares key=value
y, por lo tanto, no está en formato Hive. (La opción --recursive
para el comando aws s3 ls
especifica que se enumeran todos los objetos o archivos del directorio especificado o con el prefijo indicado).
aws s3 ls s3://athena-examples-
myregion
/elb/plaintext/ --recursive2016-11-23 17:54:46 11789573 elb/plaintext/2015/01/01/part-r-00000-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:46 8776899 elb/plaintext/2015/01/01/part-r-00001-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:46 9309800 elb/plaintext/2015/01/01/part-r-00002-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 9412570 elb/plaintext/2015/01/01/part-r-00003-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 10725938 elb/plaintext/2015/01/01/part-r-00004-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:46 9439710 elb/plaintext/2015/01/01/part-r-00005-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 0 elb/plaintext/2015/01/01_$folder$ 2016-11-23 17:54:47 9012723 elb/plaintext/2015/01/02/part-r-00006-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 7571816 elb/plaintext/2015/01/02/part-r-00007-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:47 9673393 elb/plaintext/2015/01/02/part-r-00008-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 11979218 elb/plaintext/2015/01/02/part-r-00009-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 9546833 elb/plaintext/2015/01/02/part-r-00010-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 10960865 elb/plaintext/2015/01/02/part-r-00011-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 0 elb/plaintext/2015/01/02_$folder$ 2016-11-23 17:54:48 11360522 elb/plaintext/2015/01/03/part-r-00012-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 11211291 elb/plaintext/2015/01/03/part-r-00013-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:48 8633768 elb/plaintext/2015/01/03/part-r-00014-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:49 11891626 elb/plaintext/2015/01/03/part-r-00015-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:49 9173813 elb/plaintext/2015/01/03/part-r-00016-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:49 11899582 elb/plaintext/2015/01/03/part-r-00017-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:49 0 elb/plaintext/2015/01/03_$folder$ 2016-11-23 17:54:50 8612843 elb/plaintext/2015/01/04/part-r-00018-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:50 10731284 elb/plaintext/2015/01/04/part-r-00019-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:50 9984735 elb/plaintext/2015/01/04/part-r-00020-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:50 9290089 elb/plaintext/2015/01/04/part-r-00021-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:50 7896339 elb/plaintext/2015/01/04/part-r-00022-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 8321364 elb/plaintext/2015/01/04/part-r-00023-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 0 elb/plaintext/2015/01/04_$folder$ 2016-11-23 17:54:51 7641062 elb/plaintext/2015/01/05/part-r-00024-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 10253377 elb/plaintext/2015/01/05/part-r-00025-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 8502765 elb/plaintext/2015/01/05/part-r-00026-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 11518464 elb/plaintext/2015/01/05/part-r-00027-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 7945189 elb/plaintext/2015/01/05/part-r-00028-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 7864475 elb/plaintext/2015/01/05/part-r-00029-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 0 elb/plaintext/2015/01/05_$folder$ 2016-11-23 17:54:51 11342140 elb/plaintext/2015/01/06/part-r-00030-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:51 8063755 elb/plaintext/2015/01/06/part-r-00031-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 9387508 elb/plaintext/2015/01/06/part-r-00032-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 9732343 elb/plaintext/2015/01/06/part-r-00033-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 11510326 elb/plaintext/2015/01/06/part-r-00034-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 9148117 elb/plaintext/2015/01/06/part-r-00035-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 0 elb/plaintext/2015/01/06_$folder$ 2016-11-23 17:54:52 8402024 elb/plaintext/2015/01/07/part-r-00036-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 8282860 elb/plaintext/2015/01/07/part-r-00037-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:52 11575283 elb/plaintext/2015/01/07/part-r-00038-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:53 8149059 elb/plaintext/2015/01/07/part-r-00039-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:53 10037269 elb/plaintext/2015/01/07/part-r-00040-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:53 10019678 elb/plaintext/2015/01/07/part-r-00041-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt 2016-11-23 17:54:53 0 elb/plaintext/2015/01/07_$folder$ 2016-11-23 17:54:53 0 elb/plaintext/2015/01_$folder$ 2016-11-23 17:54:53 0 elb/plaintext/2015_$folder$
Ejecución de ALTER TABLE ADD PARTITION
Dado que los datos no están en formato Hive, no se puede utilizar el comando MSCK
REPAIR TABLE
para agregar las particiones a la tabla después de crearla. Como alternativa, puede usar el comando ALTER TABLE ADD PARTITION para agregar cada partición manualmente. Por ejemplo, para cargar los datos en s3://athena-examples-myregion
/elb/plaintext/2015/01/01/, puede ejecutar la siguiente consulta. Tenga en cuenta que no se requiere una columna de partición independiente para cada carpeta de Amazon S3 y que el valor de la clave de partición puede ser diferente de la clave de Amazon S3.
ALTER TABLE elb_logs_raw_native_part ADD PARTITION (dt='2015-01-01') location 's3://athena-examples-
us-west-1
/elb/plaintext/2015/01/01/'
Si ya existe una partición, recibirá el error La partición ya existe
. Para evitar este error, puede usar la cláusula IF NOT EXISTS
. Para obtener más información, consulte ALTER TABLE ADD PARTITION. Para eliminar una partición, puede utilizar ALTER TABLE DROP
PARTITION.
Consideración de la proyección de particiones
Para evitar tener que administrar particiones por cuenta propia, puede usar la proyección de particiones. La proyección de particiones es una opción para tablas divididas en muchas partes cuya estructura se conoce de antemano. En la proyección de particiones, los valores de partición y las ubicaciones se calculan a partir de las propiedades de tabla que configure, en lugar de leerlos desde un repositorio de metadatos. Dado que los cálculos hechos en la memoria son más rápidos que la búsqueda remota, el uso de la proyección de particiones puede reducir significativamente los tiempos de ejecución de las consultas.
Para obtener más información, consulte Uso de proyección de particiones con Amazon Athena.
Recursos adicionales
-
Para obtener información sobre las opciones de partición de datos de Firehose, consulte Ejemplo de Amazon Data Firehose.
-
También puede automatizar la adición de particiones con el controlador JDBC.
-
Puede utilizar CTAS e INSERT INTO para particionar un conjunto de datos. Para obtener más información, consulte Uso de CTAS e INSERT INTO en ETL y análisis de datos.