Utilisation de CTAS et de INSERT INTO pour contourner la limite de 100 partitions - 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.

Utilisation de CTAS et de INSERT INTO pour contourner la limite de 100 partitions

Athena a une limite de 100 partitions par requête CREATE TABLE AS SELECT (CTAS). De même, vous pouvez ajouter un maximum de 100 partitions à une table de destination avec une instruction INSERT INTO. Cette limite ne s'applique que lorsque la table est compartimentée et partitionnée.

Si vous dépassez cette limite, le message d'erreur HIVE_TOO_MANY_OPEN_PARTITIONS: Exceeded limit of 100 open writers for partitions/buckets (Dépassement de la limite de 100 rédacteurs ouverts pour les partitions/compartiments) peut s'afficher. Pour contourner ces limitations, vous pouvez utiliser une instruction CTAS et une série d'instructions INSERT INTO qui créent ou insèrent jusqu'à 100 partitions chacune.

L'exemple de cette rubrique utilise une base de données appelée tpch100 dont les données résident dans l'emplacement du compartiment Simple Storage Service (Amazon S3) s3://<my-tpch-bucket>/.

Pour utiliser CTAS et INSERT INTO pour créer une table de plus de 100 partitions
  1. Utilisez une instruction CREATE EXTERNAL TABLE pour créer une table partitionnée sur le champ souhaité.

    L'instruction exemple suivante partitionne les données selon la colonne l_shipdate. La table a 2 525 partitions.

    CREATE EXTERNAL TABLE `tpch100.lineitem_parq_partitioned`( `l_orderkey` int, `l_partkey` int, `l_suppkey` int, `l_linenumber` int, `l_quantity` double, `l_extendedprice` double, `l_discount` double, `l_tax` double, `l_returnflag` string, `l_linestatus` string, `l_commitdate` string, `l_receiptdate` string, `l_shipinstruct` string, `l_comment` string) PARTITIONED BY ( `l_shipdate` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://<my-tpch-bucket>/lineitem/'
  2. Exécutez une commande SHOW PARTITIONS <table_name> comme la suivante pour répertorier les partitions.

    SHOW PARTITIONS lineitem_parq_partitioned

    Des résultats d'échantillon partiels sont présentés ci-dessous.

    /* l_shipdate=1992-01-02 l_shipdate=1992-01-03 l_shipdate=1992-01-04 l_shipdate=1992-01-05 l_shipdate=1992-01-06 ... l_shipdate=1998-11-24 l_shipdate=1998-11-25 l_shipdate=1998-11-26 l_shipdate=1998-11-27 l_shipdate=1998-11-28 l_shipdate=1998-11-29 l_shipdate=1998-11-30 l_shipdate=1998-12-01 */
  3. Exécutez une requête CTAS pour créer une table partitionnée.

    L'exemple suivant montre comment créer une table appelée my_lineitem_parq_partitioned et utiliser la clause WHERE pour restreindre la DATE à une date antérieure à 1992-02-01. Étant donné que l'exemple de jeu de données commence en janvier 1992, seules les partitions de janvier 1992 sont créées.

    CREATE table my_lineitem_parq_partitioned WITH (partitioned_by = ARRAY['l_shipdate']) AS SELECT l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_commitdate, l_receiptdate, l_shipinstruct, l_comment, l_shipdate FROM tpch100.lineitem_parq_partitioned WHERE cast(l_shipdate as timestamp) < DATE ('1992-02-01');
  4. Exécutez la commande SHOW PARTITIONS pour vérifier que la table contient les partitions souhaitées.

    SHOW PARTITIONS my_lineitem_parq_partitioned;

    Les partitions de l'exemple datent de janvier 1992.

    /* l_shipdate=1992-01-02 l_shipdate=1992-01-03 l_shipdate=1992-01-04 l_shipdate=1992-01-05 l_shipdate=1992-01-06 l_shipdate=1992-01-07 l_shipdate=1992-01-08 l_shipdate=1992-01-09 l_shipdate=1992-01-10 l_shipdate=1992-01-11 l_shipdate=1992-01-12 l_shipdate=1992-01-13 l_shipdate=1992-01-14 l_shipdate=1992-01-15 l_shipdate=1992-01-16 l_shipdate=1992-01-17 l_shipdate=1992-01-18 l_shipdate=1992-01-19 l_shipdate=1992-01-20 l_shipdate=1992-01-21 l_shipdate=1992-01-22 l_shipdate=1992-01-23 l_shipdate=1992-01-24 l_shipdate=1992-01-25 l_shipdate=1992-01-26 l_shipdate=1992-01-27 l_shipdate=1992-01-28 l_shipdate=1992-01-29 l_shipdate=1992-01-30 l_shipdate=1992-01-31 */
  5. Utilisez une instruction INSERT INTO pour ajouter des partitions à la table.

    L'exemple suivant montre comment ajouter des partitions pour les dates du mois de février 1992.

    INSERT INTO my_lineitem_parq_partitioned SELECT l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_commitdate, l_receiptdate, l_shipinstruct, l_comment, l_shipdate FROM tpch100.lineitem_parq_partitioned WHERE cast(l_shipdate as timestamp) >= DATE ('1992-02-01') AND cast(l_shipdate as timestamp) < DATE ('1992-03-01');
  6. Exécutez à nouveau SHOW PARTITIONS.

    SHOW PARTITIONS my_lineitem_parq_partitioned;

    La table d'exemple comporte maintenant des partitions de janvier et de février 1992.

    /* l_shipdate=1992-01-02 l_shipdate=1992-01-03 l_shipdate=1992-01-04 l_shipdate=1992-01-05 l_shipdate=1992-01-06 ... l_shipdate=1992-02-20 l_shipdate=1992-02-21 l_shipdate=1992-02-22 l_shipdate=1992-02-23 l_shipdate=1992-02-24 l_shipdate=1992-02-25 l_shipdate=1992-02-26 l_shipdate=1992-02-27 l_shipdate=1992-02-28 l_shipdate=1992-02-29 */
  7. Continuez à utiliser des instructions INSERT INTO qui ne lisent et n'ajoutent pas plus de 100 partitions chacune. Continuez jusqu'à atteindre le nombre de partitions dont vous avez besoin.

    Important

    Lorsque vous définissez la condition WHERE, assurez-vous que les requêtes ne se chevauchent pas. Sinon, certaines partitions peuvent comprendre des données dupliquées.