Usa CTAS e INSERT INTO per aggirare il limite di 100 partizioni - Amazon Athena

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Usa CTAS e INSERT INTO per aggirare il limite di 100 partizioni

Athena ha un limite di 100 partizioni per query CREATE TABLE AS SELECT (CTAS). Allo stesso modo, è possibile aggiungere un massimo di 100 partizioni a una tabella di destinazione con un'istruzione INSERT INTO.

Se superi questa limitazione potresti ricevere il messaggio di errore HIVE_TOO_MANY_OPEN_PARTITIONS: Exceeded limit of 100 open writers for partitions/buckets (HIVE_TOO_MANY_OPEN_PARTITIONS: limite di 100 scrittori aperti per partizioni/bucket superato). Per ovviare questa limitazione, puoi utilizzare un'istruzione CTAS e una serie di istruzioni INSERT INTO che creano o inseriscono fino a 100 partizioni ciascuna.

L'esempio in questo argomento utilizza un database chiamato i tpch100 cui dati risiedono nella posizione del bucket Amazon S3 s3://amzn-s3-demo-bucket/.

Per utilizzare CTAS e INSERT INTO per creare una tabella con più di 100 partizioni
  1. Utilizzare un'istruzione CREATE EXTERNAL TABLE per creare una tabella partizionata nel campo desiderato.

    L'istruzione di esempio seguente partiziona i dati dalla colonna l_shipdate. La tabella ha 2525 partizioni.

    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. Eseguire un comando SHOW PARTITIONS <table_name> come il seguente per elencare le partizioni.

    SHOW PARTITIONS lineitem_parq_partitioned

    Di seguito sono riportati i risultati parziali di esempio.

    /* 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. Eseguire una query CTAS per creare una tabella partizionata.

    L'esempio seguente crea una tabella chiamata my_lineitem_parq_partitioned e utilizza la clausola WHERE in modo che DATE sia precedente a 1992-02-01. Poiché il set di dati di esempio inizia con gennaio 1992, vengono create solo le partizioni per gennaio 1992.

    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. Eseguire il comando SHOW PARTITIONS per verificare che la tabella contenga le partizioni desiderate.

    SHOW PARTITIONS my_lineitem_parq_partitioned;

    Le partizioni nell'esempio sono per gennaio 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. Utilizzare un'istruzione INSERT INTO per aggiungere le partizioni alla tabella.

    Nell'esempio seguente vengono aggiunte le partizioni per le date del mese di febbraio 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. Eseguire nuovamente SHOW PARTITIONS.

    SHOW PARTITIONS my_lineitem_parq_partitioned;

    La tabella di esempio ora ha partizioni sia da gennaio che da febbraio 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. Continuare a utilizzare le istruzioni INSERT INTO che leggono e aggiungono non più di 100 partizioni ciascuna. Continuare fino a raggiungere il numero di partizioni necessarie.

    Importante

    Quando imposti la condizione WHERE, assicurati che le query non si sovrappongano. In caso contrario, alcune partizioni potrebbero avere dati duplicati.