Utilisez CTAS et 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.

Utilisez CTAS et 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 à l'aide d'une INSERTINTOinstruction.

Si vous dépassez cette limite, le message d'erreur HIVE_ _ _ TOO MANY OPEN _ peut s'afficher PARTITIONS : Dépassement de la limite de 100 enregistreurs ouverts pour les partitions/compartiments. Pour contourner cette limitation, vous pouvez utiliser une CTAS instruction et une série d'INSERT INTOinstructions qui créent ou insèrent jusqu'à 100 partitions chacune.

L'exemple présenté dans cette rubrique utilise une base de données appelée tpch100 dont les données se trouvent dans l'emplacement du compartiment Amazon S3 s3://amzn-s3-demo-bucket/.

Pour utiliser CTAS et INSERT INTO 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://amzn-s3-demo-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 CTAS requête 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.