Partitionnement de données dans Athena - Amazon Athena

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Partitionnement de données dans Athena

En partitionnant vos données, vous pouvez limiter la quantité de données analysées par chaque requête, ce qui améliore les performances et réduit les coûts. de n’importe quelle clé de partition. Il est d'usage de partitionner les données en fonction de l'heure, ce qui conduit souvent à un schéma de partitionnement à plusieurs niveaux. Par exemple, un client qui reçoit des données toutes les heures peut décider de les partitionner par année, par mois, par date et par heure. Un autre client, qui reçoit des données de nombreuses sources différentes mais qui sont chargées une seule fois par jour, peut les partitionner par date et par identifiant de source de données.

Athena peut utiliser des partitions de style Apache Hive dont les chemins de données contiennent des paires de valeur clé connectées par des signes égal (par exemple country=us/... ou year=2021/month=01/day=26/...). Ainsi, les chemins incluent à la fois les noms des clés de partition et les valeurs que chaque chemin représente. Pour charger de nouvelles partitions Hive dans une table partitionnée, vous pouvez utiliser la commande MSCK REPAIR TABLE qui fonctionne uniquement avec des partitions de style Hive.

Athena peut également utiliser des schémas de partitionnement non compatibles avec Hive. Par exemple, les CloudTrail journaux et les flux de diffusion Firehose utilisent des composants de chemin distincts pour les parties de date, telles que. data/2021/01/26/us/6fc7845e.json Pour les partitions de style non compatibles avec Hive, utilisez ALTER TABLE ADD PARTITION pour ajouter les partitions manuellement.

Considérations et restrictions

Lorsque vous utilisez le partitionnement, gardez à l'esprit les points suivants :

  • Si vous interrogez une table partitionnée et spécifiez la partition dans la clause WHERE, Athena analyse les données uniquement à partir de cette partition. Pour plus d’informations, consultez Emplacement de table et partitions.

  • Si vous exécutez des requêtes sur les compartiments Simple Storage Service (Amazon S3) avec un grand nombre d'objets et que les données ne sont pas partitionnées, de telles requêtes peuvent affecter les limites de débit de demande GET dans Simple Storage Service (Amazon S3) et conduire à des exceptions Simple Storage Service (Amazon S3). Pour éviter des erreurs, partitionnez vos données. En outre, envisagez de régler vos taux de demande Simple Storage Service (Amazon S3). Pour plus d'informations, consultez la rubrique Bonnes pratiques de conception : optimisation des performances Simple Storage Service (Amazon S3).

  • Les emplacements de partition à utiliser avec Athena doivent utiliser le protocole s3 (par exemple, s3://DOC-EXAMPLE-BUCKET/folder/). Dans Athena, les emplacements qui utilisent d'autres protocoles (par exemple, s3a://DOC-EXAMPLE-BUCKET/folder/) provoquent des échecs de requête lorsque les requêtes MSCK REPAIR TABLE sont exécutées sur les tables contenant les données.

  • Assurez-vous que le chemin Simple Storage Service (Amazon S3) est en minuscules et non en casse mixte (par exemple, userid au lieu de userId). Si le chemin S3 est en casse mixte, MSCK REPAIR TABLE n'ajoute pas les partitions au AWS Glue Data Catalog. Pour plus d’informations, consultez MSCK REPAIR TABLE.

  • Étant donné que MSCK REPAIR TABLE analyse à la fois un dossier et ses sous-dossiers pour trouver un schéma de partition correspondant, veillez à conserver les données des différentes tables dans des hiérarchies de dossiers distinctes. Supposons, par exemple, que vous ayez des données pour le tableau 1 dans s3://DOC-EXAMPLE-BUCKET1 et des données pour le tableau 2 danss3://DOC-EXAMPLE-BUCKET1/table-2-data. Si les deux tables sont partitionnées par chaîne, MSCK REPAIR TABLE ajoutera les partitions de la table 2 à la table 1. Pour éviter cela, utilisez des structures de dossiers distinctes telles que s3://DOC-EXAMPLE-BUCKET1 et à la s3://DOC-EXAMPLE-BUCKET2 place. Notez que ce comportement est compatible avec Amazon EMR et Apache Hive.

  • Si vous l'utilisez AWS Glue Data Catalog avec Athena, consultez la section AWS Glue Points de terminaison et quotas pour les quotas de service sur les partitions par compte et par table.

  • Pour demander une augmentation du quota de partitions si vous utilisez le AWS Glue Data Catalog, visitez la console Service Quotas pour AWS Glue.

Création et chargement d'une table avec des données partitionnées

Pour créer une table qui utilise des partitions, utilisez la clause PARTITIONED BY dans votre instruction CREATE TABLE. La clause PARTITIONED BY définit les clés sur lesquelles les données doivent être partitionnées, comme dans l'exemple suivant. La clause LOCATION spécifie l'emplacement racine des données partitionnées.

CREATE EXTERNAL TABLE users ( first string, last string, username string ) PARTITIONED BY (id string) STORED AS parquet LOCATION 's3://DOC-EXAMPLE-BUCKET'

Après avoir créé la table, vous chargez les données dans les partitions pour l'interrogation. Pour les partitions de style Hive, exécutez MSCK REPAIR TABLE. Pour les partitions de style non compatibles avec Hive, utilisez ALTER TABLE ADD PARTITION pour ajouter les partitions manuellement.

Préparation des données compatibles avec Hive et non compatibles avec Hive pour l'interrogation

Les sections suivantes expliquent comment préparer des données compatibles avec Hive et non compatibles avec Hive pour l'interrogation dans Athena.

Scénario 1 : données stockées sur Amazon S3 au format Hive

Les partitions sont stockées dans des dossiers distincts, dans Amazon S3. Par exemple, voici une liste partielle pour un exemple d'impressions publicitaires produites par la commande aws s3 ls, qui répertorie les objets S3 sous un préfixe spécifié :

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/

Ici, les fichiers journaux sont stockés avec le nom de colonne (dt) défini sur les incréments de date, d'heures et de minutes. Lorsque vous fournissez une DDL avec l'emplacement du dossier parent, le schéma et le nom de la colonne partitionnée, Athena peut exécuter des requêtes sur les données figurant dans ces sous-dossiers.

Création de la table

Pour générer une table à partir de ces données, créez une partition avec 'dt' comme dans l'instruction DDL Athena suivante :

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/' ;

Cette table utilise le sérialiseur-désérialiseur JSON natif de Hive pour lire des données JSON stockées dans Simple Storage Service (Amazon S3). Pour de plus amples informations sur les formats pris en charge, veuillez consulter SerDe et formats de données pris en charge.

Exécuter MSCK REPAIR TABLE

Après avoir exécuté la requête CREATE TABLE, exécutez la commande MSCK REPAIR TABLE dans l'éditeur de requêtes Athena pour charger les partitions, comme dans l'exemple suivant.

MSCK REPAIR TABLE impressions

Une fois que vous avez exécuté cette commande, les données sont prêtes à être interrogées.

Exécution des requêtes de données

Exécutez des requêtes sur les données sur la table des impressions en utilisant la colonne de partition. Voici un exemple :

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

Cette requête devrait montrer des résultats similaires aux suivants :

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

Scénario 2 : Les données ne sont pas partitionnées au format Hive

Dans l'exemple suivant, la commande aws s3 ls affiche les journaux ELB stockés dans Amazon S3. Notez que la mise en page des données n'utilise pas de paires key=value et n'est donc pas au format Hive. (L'option --recursive pour la commande aws s3 ls précise que tous les fichiers ou objets du répertoire ou du préfixe spécifié doivent être répertoriés.)

aws s3 ls s3://athena-examples-myregion/elb/plaintext/ --recursive 2016-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$

Exécuter ALTER TABLE ADD PARTITION

Étant donné que les données ne sont pas au format Hive, vous ne pouvez pas utiliser la commande MSCK REPAIR TABLE pour ajouter les partitions à la table une fois que vous l'avez créée. Au lieu de cela, vous pouvez utiliser la commande ALTER TABLE ADD PARTITION pour ajouter chaque partition manuellement. Par exemple, pour charger les données dans s3://athena-examples-myregion/elb/plaintext/2015/01/01/, vous pouvez exécuter la requête suivante : Notez qu'une colonne de partition distincte pour chaque dossier Simple Storage Service (Amazon S3) n'est pas requise et que la valeur clé de partition peut être différente de celle de la clé Simple Storage Service (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 une partition existe déjà, vous recevez l'erreur Partition already exists (Partition déjà existante). Pour éviter cette erreur, vous pouvez utiliser la clause IF NOT EXISTS. Pour plus d’informations, consultez ALTER TABLE ADD PARTITION. Pour supprimer une partition, vous pouvez utiliser ALTER TABLE DROP PARTITION.

Projection de partition

Pour éviter d'avoir à gérer les partitions, vous pouvez utiliser la projection de partition. La projection de partitions est une option pour les tables hautement partitionnées dont la structure est connue à l'avance. Dans une projection de partition, les valeurs et les emplacements de partition sont calculés à partir des propriétés de la table que vous configurez au lieu d'être lus à partir d'un référentiel de métadonnées. Étant donné que les calculs en mémoire sont plus rapides que la recherche à distance, l'utilisation de la projection de partition peut réduire considérablement les temps d'exécution des requêtes.

Pour plus d’informations, consultez Projection de partition avec Amazon Athena.

Ressources supplémentaires