

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

# Creazione di indici di partizione
<a name="partition-indexes"></a>

Nel corso del tempo, centinaia di migliaia di partizioni vengono aggiunte a una tabella. L'[GetPartitions API](https://docs.aws.amazon.com/glue/latest/webapi/API_GetPartitions.html) viene utilizzata per recuperare le partizioni nella tabella. L'API restituisce partizioni che corrispondono all'espressione fornita nella richiesta.

Prendiamo come esempio una tabella *sales\$1data* che è partizionata dalle chiavi *Country*, *Category*, *Year*, *Month* and *creationDate*. Se si desidera ottenere i dati di vendita per tutti gli articoli venduti per la categoria *Books* nell'anno 2020, dopo il *2020-08-15*, occorre inviare una richiesta `GetPartitions` con l'espressione “Category = 'Books' and creationDate > '2020-08-15'” al catalogo dati.

Se nella tabella non sono presenti indici delle partizioni, AWS Glue carica tutte le partizioni della tabella e quindi filtra le partizioni caricate utilizzando l'espressione di query fornita dall'utente nella richiesta `GetPartitions`. L'esecuzione della query richiede più tempo man mano che il numero di partizioni aumenta in una tabella senza indici. Con un indice, la query `GetPartitions` cercherà di recuperare un sottoinsieme delle partizioni invece di caricare tutte le partizioni nella tabella.

**Topics**
+ [Informazioni sugli indici delle partizioni](#partition-index-1)
+ [Creazione di una tabella con indici delle partizioni](#partition-index-creating-table)
+ [Aggiunta di un indice di partizione a una tabella esistente](#partition-index-existing-table)
+ [Descrizione degli indici delle partizioni su una tabella](#partition-index-describing)
+ [Limitazioni all'utilizzo degli indici delle partizioni](#partition-index-limitations)
+ [Utilizzo degli indici per una chiamata ottimizzata GetPartitions](#partition-index-getpartitions)
+ [Integrazione con i motori](#partition-index-integration-engines)

## Informazioni sugli indici delle partizioni
<a name="partition-index-1"></a>

Quando crei un indice di partizione, specifichi un elenco di chiavi di partizione già esistenti in una determinata tabella. L'indice delle partizioni è un sottoelenco di chiavi di partizione definite nella tabella. Un indice di partizione può essere creato su qualsiasi permutazione delle chiavi di partizione definite nella tabella. Per la tabella *sales\$1data* di cui sopra, gli indici possibili sono (country, category, creationDate), (country, category, year), (country, category), (country), (category, country, year, month) e così via.

Il catalogo dati concatenerà i valori delle partizioni nell'ordine fornito al momento della creazione dell'indice. L'indice viene creato in modo coerente man mano che le partizioni vengono aggiunte alla tabella. Gli indici possono essere creati per i tipi di colonna String (string, char e varchar), Numeric (int, bigint, long, tinyint e smallint) e Date (yyyy-MM-dd). 

**Tipi di dati supportati**
+ Data: una data in formato ISO, ad esempio `YYYY-MM-DD`. Ad esempio, la data `2020-08-15`. Il formato utilizza i trattini (‐) per separare l'anno, il mese e il giorno. L'intervallo consentito per le date di indicizzazione va da `0000-01-01` a `9999-12-31`.
+ String: una stringa letterale racchiusa tra virgolette singole o doppie. 
+ Char: lunghezza fissa dei dati dei caratteri specificata tra 1 e 255, ad esempio char(10).
+ Varchar: lunghezza variabile dei dati dei caratteri specificata tra 1 e 65.535, ad esempio varchar(10).
+ Numeric (numerico): int, bigint, long, tinyint e smallint

Gli indici sui tipi di dati Numeric, String e Date supportano gli operatori =, >, >=, <, <= e between. La soluzione di indicizzazione attualmente supporta solo l'operatore logico `AND`. Le sottoespressioni con gli operatori “LIKE”, “IN”, “OR” e “NOT” vengono ignorate nell'espressione il filtraggio con indice. Il filtraggio per la sottoespressione ignorata viene eseguito sulle partizioni recuperate dopo aver applicato il filtraggio dell'indice.

Per ogni partizione aggiunta a una tabella, viene creato un elemento indice corrispondente. Per una tabella con partizioni “n”, l'indice di partizione 1 risulterà come elementi indice di partizione “n”. L'indice di partizione “m” sulla stessa tabella risulterà come elementi di indice di partizione “m\$1n”. Ogni elemento dell'indice della partizione verrà addebitato in base alla policy dei prezzi AWS Glue corrente per l'archiviazione del catalogo dati. Per informazioni dettagliate sui prezzi degli oggetti di archiviazione, consulta [Prezzi di AWS Glue](https://aws.amazon.com/glue/pricing/).

## Creazione di una tabella con indici delle partizioni
<a name="partition-index-creating-table"></a>

È possibile creare un indice di partizione durante la creazione di una tabella. La richiesta `CreateTable` utilizza un elenco di [oggetti `PartitionIndex`](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-PartitionIndex) come input. È possibile creare un massimo di 3 indici delle partizioni su una determinata tabella. Ogni indice di partizione richiede un nome e un elenco di `partitionKeys` definite per la tabella. Gli indici creati su una tabella possono essere recuperati utilizzando l'[API `GetPartitionIndexes`](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-GetPartitionIndexes)

## Aggiunta di un indice di partizione a una tabella esistente
<a name="partition-index-existing-table"></a>

Per aggiungere un indice di partizione a una tabella esistente, utilizza l'operazione `CreatePartitionIndex`. Puoi creare un solo `PartitionIndex` per ogni operazione `CreatePartitionIndex`. L'aggiunta di un indice non influisce sulla disponibilità di una tabella, poiché durante la creazione degli indici la tabella continua a essere disponibile.

Lo stato dell'indice per una partizione aggiunta è impostato su CREATING (CREAZIONE IN CORSO) e la creazione dei dati di indice viene avviata. Se il processo per la creazione degli indici ha esito positivo, IndexStatus viene aggiornato in ACTIVE (ATTIVO) e, per un processo non riuscito, lo stato dell'indice viene aggiornato a FAILED (NON RIUSCITO). La creazione dell'indice può avere esito negativo per diversi motivi ed è possibile utilizzare l'operaizione `GetPartitionIndexes` per recuperare i dettagli dell'errore. I possibili errori sono:
+ ENCRYPTED\$1PARTITION\$1ERROR: la creazione di indici su una tabella con partizioni crittografate non è supportata.
+ INVALID\$1PARTITION\$1TYPE\$1DATA\$1ERROR: riscontrato quando il parametro `partitionKey` non è un valore valido per il tipo di dati della `partitionKey` corrispondente. Ad esempio: una `partitionKey` con il tipo di dati 'int' ha un valore 'foo'.
+ MISSING\$1PARTITION\$1VALUE\$1ERROR: riscontrato quando il `partitionValue` per un `indexedKey` non è presente. Ciò può accadere quando una tabella non è partizionata in modo coerente.
+ UNSUPPORTED\$1PARTITION\$1CHARACTER\$1ERROR: riscontrato quando il valore di una chiave di partizione indicizzata contiene i caratteri \$1u0000, \$1u0001 o \$1u0002
+ INTERNAL\$1ERROR: si è verificato un errore interno durante la creazione degli indici. 

## Descrizione degli indici delle partizioni su una tabella
<a name="partition-index-describing"></a>

Per recuperare gli indici delle partizioni creati su una tabella, utilizza l'operazione `GetPartitionIndexes`. La parte risposta mostra tutti gli indici della tabella insieme allo stato corrente di ciascun indice (`IndexStatus`).

L'`IndexStatus` di un indice può essere uno dei seguenti:
+ `CREATING`: l'indice è in fase di creazione e non è ancora disponibile per l'uso.
+ `ACTIVE`: l'indice è pronto per l'uso. Le richieste possono utilizzare l'indice per eseguire una query ottimizzata.
+ `DELETING`: l'indice è attualmente in fase di eliminazione e non può essere più utilizzato. Un indice nello stato attivo può essere eliminato utilizzando la richiesta `DeletePartitionIndex`, che sposta lo stato da ACTIVE (ATTIVO) a DELETING (ELIMINAZIONE IN CORSO).
+ `FAILED`: la creazione dell'indice su una tabella esistente non è riuscita. Ogni tabella memorizza gli ultimi 10 indici non riusciti.

Le possibili transizioni di stato per gli indici creati su una tabella esistente sono le seguenti:
+ CREATING → ACTIVE → DELETING (CREAZIONE → ATTIVO → ELIMINAZIONE IN CORSO)
+ CREATING → FAILED (IN FASE DI CREAZIONE → NON RIUSCITO)

## Limitazioni all'utilizzo degli indici delle partizioni
<a name="partition-index-limitations"></a>

Dopo aver creato un indice delle partizioni, prendi nota delle seguenti modifiche alla funzionalità di tabella e partizione:

**Creazione di una nuova partizione (dopo l'aggiunta dell'indice)**  
Dopo aver creato un indice delle partizioni su una tabella, tutte le nuove partizioni aggiunte alla tabella verranno convalidate per i controlli del tipo di dati per le chiavi indicizzate. Il valore di partizione delle chiavi indicizzate verrà convalidato per il formato del tipo di dati. Se il controllo del tipo di dati non riesce, l'operazione di creazione della partizione avrà esito negativo. Per la tabella *sales\$1data*, se viene creato un indice per le chiavi (category [categoria], year [anno]) in cui la categoria è di tipo `string` e l'anno di tipo `int`, la creazione della nuova partizione con un valore YEAR come “foo” non riuscirà.

Dopo che gli indici sono abilitati, l'aggiunta di partizioni con valori chiave indicizzati aventi i caratteri U\$10000, U\$100001 e U\$10002 inizierà ad avere esito negativo.

**Aggiornamenti tabella**  
Una volta creato un indice delle partizioni in una tabella, non è possibile modificare i nomi delle chiavi di partizione esistenti né modificare il tipo o l'ordine delle chiavi registrate con l'indice.

## Utilizzo degli indici per una chiamata ottimizzata GetPartitions
<a name="partition-index-getpartitions"></a>

Quando chiami `GetPartitions` su una tabella con un indice, puoi includere un'espressione e, se possibile, il catalogo dati utilizzerà un indice. La prima chiave dell'indice deve essere trasmessa nell'espressione per utilizzare gli indici nel filtro. L'ottimizzazione dell'indice nel filtraggio viene applicata come miglior tentativo. Il catalogo dati tenta di utilizzare il più possibile l'ottimizzazione dell'indice, ma in caso di indice mancante o di operatore non supportato, ritorna all'implementazione esistente di caricamento di tutte le partizioni. 

Per la tabella *sales\$1data* di cui sopra, aggiungiamo l'indice [Country, Category, Year]. Se “Country” non viene trasmesso nell'espressione, l'indice registrato non sarà in grado di filtrare le partizioni utilizzando gli indici. È possibile aggiungere fino a 3 indici per supportare vari modelli di query.

Prendiamo alcune espressioni di esempio e vediamo come funzionano gli indici:


| Espressioni | Come verrà utilizzato l'indice | 
| --- | --- | 
|  Country = 'US'  |  L'indice verrà utilizzato per filtrare le partizioni.  | 
|  Country = 'US' and Category = 'Shoes'  |  L'indice verrà utilizzato per filtrare le partizioni.  | 
|  Category = 'Shoes'  |  Gli indici non utilizzati come “country” non verranno specificati nell'espressione. Tutte le partizioni verranno caricate per restituire una risposta.  | 
|  Country = 'US' and Category = 'Shoes' and Year > '2018'  |  L'indice verrà utilizzato per filtrare le partizioni.  | 
|  Country = 'US' and Category = 'Shoes' and Year > '2018' and month = 2  |  L'indice verrà utilizzato per recuperare tutte le partizioni con country = “US” e category = “shoes” e year > 2018. Quindi, verrà eseguito il filtraggio sull'espressione del mese.  | 
|  Country = 'US' AND Category = 'Shoes' OR Year > '2018'  |  Gli indici non verranno utilizzati poiché nell'espressone è presente l'operatore `OR`.  | 
|  Country = 'US' AND Category = 'Shoes' AND (Year = 2017 OR Year = '2018')  |  L'indice verrà utilizzato per recuperare tutte le partizioni con country = “US” e category = “shoes” e quindi verrà eseguito il filtraggio sull'espressione del mese.  | 
|  Country in ('US', 'UK') AND Category = 'Shoes'  |  Gli indici non verranno utilizzati per il filtraggio poiché l'operatore `IN` al momento non è supportato.  | 
|  Country = 'US' AND Category in ('Shoes', 'Books')  |  L'indice verrà utilizzato per recuperare tutte le partizioni con country = “US”, quindi verrà eseguito il filtro sull'espressione Category.  | 
|  Country = 'US' AND Category in ('Shoes', 'Books') AND (creationDate > '2023-9-01')  |  L'indice verrà utilizzato per recuperare tutte le partizioni con country = “US”, con creationDate > '2023-9-01', quindi verrà eseguito il filtro sull'espressione Category.  | 

## Integrazione con i motori
<a name="partition-index-integration-engines"></a>

Redshift Spectrum, Amazon EMR ed AWS Glue ETL Spark DataFrames sono in grado di utilizzare gli indici per recuperare le partizioni dopo che gli indici sono in uno stato ATTIVO in. AWS Glue [Athena](https://docs.aws.amazon.com/athena/latest/ug/glue-best-practices.html#glue-best-practices-partition-index) e i [frame dinamici AWS Glue ETL](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html#aws-glue-programming-etl-partitions-cat-predicates) richiedono di eseguire ulteriori passaggi per utilizzare gli indici per il miglioramento delle query.

### Abilitare la filtrazione delle partizioni
<a name="enable-partition-filtering-athena"></a>

Per abilitare la filtrazione delle partizioni in Athena, è necessario aggiornare le proprietà della tabella come segue:

1. ****Nella console, in Data Catalog, scegli Tabelle. AWS Glue ****

1. Scegliere una tabella .

1. In **Azioni**, scegliere **Modifica tabella**.

1. In **Proprietà della tabella**, aggiungere quanto segue:
   + Chiave – `partition_filtering.enabled`
   + Valore: `true`

1. Scegli **Applica**.

In alternativa, è possibile impostare questo parametro eseguendo una query [MODIFICA DELLE PROPRIETÀ DEL SET DI TABELLE](https://docs.aws.amazon.com/athena/latest/ug/alter-table-set-tblproperties.html) in Athena.

```
ALTER TABLE partition_index.table_with_index
SET TBLPROPERTIES ('partition_filtering.enabled' = 'true')
```