

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à.

# Utilizzare CTAS e INSERT INTO per aggirare il limite di 100 partizioni
<a name="ctas-insert-into"></a>

Athena ha un limite di 100 partizioni per query `CREATE TABLE AS SELECT` ([CTAS](ctas.md)). Allo stesso modo, è possibile aggiungere un massimo di 100 partizioni a una tabella di destinazione con un'istruzione [INSERT INTO](https://docs.aws.amazon.com/athena/latest/ug/insert-into.html).

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.

Nell’esempio in questo argomento viene utilizzato un database chiamato `tpch100` i cui dati risiedono nella posizione del bucket Amazon S3 s3://<my-tpch-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/'
   ```

1. 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
   */
   ```

1. 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');
   ```

1. 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
   */
   ```

1. 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');
   ```

1. 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
   */
   ```

1. 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.