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 INTO
instructions 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
-
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/'
-
Exécutez une commande
SHOW PARTITIONS
comme la suivante pour répertorier les partitions.<table_name>
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 */
-
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 clauseWHERE
pour restreindre laDATE
à 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');
-
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 */
-
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');
-
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 */
-
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.