

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

# Esempio di Amazon Data Firehose
<a name="partition-projection-kinesis-firehose-example"></a>

Quando si utilizza Firehose per consegnare dati ad Amazon S3, la configurazione di default scrive oggetti con chiavi simili al seguente esempio:

```
s3://amzn-s3-demo-bucket/prefix/yyyy/MM/dd/HH/file.extension
```

Per creare una tabella Athena che trovi automaticamente le partizioni al momento della query, invece di doverle aggiungere all'arrivo di nuovi dati, puoi utilizzare la AWS Glue Data Catalog proiezione delle partizioni.

Il seguente esempio di `CREATE TABLE` utilizza la configurazione di default di Firehose.

```
CREATE EXTERNAL TABLE my_ingested_data (
 ...
)
...
PARTITIONED BY (
 datehour STRING
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.datehour.type" = "date",
 "projection.datehour.format" = "yyyy/MM/dd/HH",
 "projection.datehour.range" = "2021/01/01/00,NOW",
 "projection.datehour.interval" = "1",
 "projection.datehour.interval.unit" = "HOURS",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${datehour}/"
)
```

La clausola `TBLPROPERTIES` nell'istruzione `CREATE TABLE` indica ad Athena quanto segue:
+ Usa la proiezione delle partizioni durante la query sulla tabella
+ La chiave di partizione `datehour` è di tipo `date` (che include un orario facoltativo)
+ Come vengono formattate le date
+ L'intervallo di date e orari Tieni presente che i valori devono essere separati da virgole, non da trattini.
+ Dove trovare i dati su Amazon S3.

Quando si esegue una query sulla tabella, Athena calcola i valori per `datehour` e utilizza il modello di posizione di archiviazione per generare un elenco di posizioni di partizione.

**Topics**
+ [Come utilizzare il tipo `date`](partition-projection-kinesis-firehose-example-using-the-date-type.md)
+ [Come scegliere le chiavi di partizione](partition-projection-kinesis-firehose-example-choosing-partition-keys.md)
+ [Come utilizzare prefissi personalizzati e partizionamento dinamico](partition-projection-kinesis-firehose-example-using-custom-prefixes-and-dynamic-partitioning.md)

# Come utilizzare il tipo `date`
<a name="partition-projection-kinesis-firehose-example-using-the-date-type"></a>

Quando si utilizza il tipo `date` per una chiave di partizione proiettata, è necessario specificare un intervallo. Poiché non si dispone di dati per le date precedenti alla creazione del flusso di consegna di Firehose, è possibile utilizzare la data di creazione come inizio. E poiché non si dispone di dati per le date in futuro, è possibile utilizzare il token speciale `NOW` come la fine.

Nell'esempio `CREATE TABLE`, la data di inizio è specificata come 1 gennaio 2021 a mezzanotte UTC.

**Nota**  
Configurare un intervallo che corrisponda il più possibile ai propri dati in modo che Athena cerchi solo le partizioni esistenti.

Quando viene eseguita una query sulla tabella di esempio, Athena utilizza le condizioni sulla chiave di partizione `datehour` insieme all'intervallo per generare i valori. Considera la query seguente:

```
SELECT *
FROM my_ingested_data
WHERE datehour >= '2020/12/15/00'
AND datehour < '2021/02/03/15'
```

La prima condizione nella query `SELECT` utilizza una data precedente all'inizio dell'intervallo di date specificato dall'istruzione `CREATE TABLE`. Poiché la configurazione di proiezione delle partizioni non specifica partizioni per le date precedenti al 1° gennaio 2021, Athena cerca i dati solo nelle posizioni seguenti e ignora le date precedenti nella query.

```
s3://amzn-s3-demo-bucket/prefix/2021/01/01/00/
s3://amzn-s3-demo-bucket/prefix/2021/01/01/01/
s3://amzn-s3-demo-bucket/prefix/2021/01/01/02/
...
s3://amzn-s3-demo-bucket/prefix/2021/02/03/12/
s3://amzn-s3-demo-bucket/prefix/2021/02/03/13/
s3://amzn-s3-demo-bucket/prefix/2021/02/03/14/
```

Analogamente, se la query viene eseguita in una data e ora precedenti al 3 febbraio 2021 alle 15:00, l'ultima partizione rifletterebbe la data e l'ora correnti, non la data e l'ora nella condizione della query.

Se si desidera eseguire una query per i dati più recenti, è possibile sfruttare il fatto che Athena non genera date future e specificare solo un inizio `datehour`, come nel seguente esempio.

```
SELECT *
FROM my_ingested_data
WHERE datehour >= '2021/11/09/00'
```

# Come scegliere le chiavi di partizione
<a name="partition-projection-kinesis-firehose-example-choosing-partition-keys"></a>

È possibile specificare in che modo la proiezione delle partizioni mappa le posizioni delle partizioni alle chiavi di partizione. Nell'esempio `CREATE TABLE` nella sezione precedente, la data e l'ora sono state combinate in una chiave di partizione chiamata datehour, ma sono possibili altri schemi. Ad esempio, è possibile configurare una tabella con chiavi di partizione separate per l'anno, il mese, il giorno e l'ora. 

Tuttavia, la suddivisione delle date in anno, mese e giorno significa che il tipo di proiezione della partizione `date` non può essere utilizzato. Un'alternativa consiste nel separare la data dall'ora per sfruttare comunque il tipo di proiezione della partizione `date`, ma rendere più facili da leggere le query che specificano gli intervalli di ore.

Ricordando questo, nell'esempio `CREATE TABLE` seguente la data viene separata dall'ora. Poiché `date` è una parola riservata in SQL, nell'esempio viene utilizzata `day` come nome la chiave di partizione che rappresenta la data.

```
CREATE EXTERNAL TABLE my_ingested_data2 (
 ...
)
...
PARTITIONED BY (
 day STRING,
 hour INT
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.day.type" = "date",
 "projection.day.format" = "yyyy/MM/dd",
 "projection.day.range" = "2021/01/01,NOW",
 "projection.day.interval" = "1",
 "projection.day.interval.unit" = "DAYS",
 "projection.hour.type" = "integer",
 "projection.hour.range" = "0,23",
 "projection.hour.digits" = "2",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${day}/${hour}/"
)
```

Nell'istruzione `CREATE TABLE` di esempio, l'ora è una chiave di partizione separata configurata come numero intero. La configurazione per la chiave di partizione dell'ora specifica l'intervallo da 0 a 23 e che l'ora deve essere formattata con due cifre quando Athena genera le posizioni della partizione.

Una query per la tabella `my_ingested_data2` potrebbe essere simile alla seguente:

```
SELECT *
FROM my_ingested_data2
WHERE day = '2021/11/09'
AND hour > 3
```

## Comprendere tipi di chiavi di partizione e tipi di proiezione delle partizioni
<a name="partition-projection-kinesis-firehose-example-partition-key-types-and-partition-projection-types"></a>

Tieni presente che la chiave `datehour` nel primo esempio `CREATE TABLE` è configurata come `date` nella configurazione di proiezione della partizione, ma il tipo di chiave di partizione è `string`. Lo stesso vale per `day` nel secondo esempio. I tipi nella configurazione di proiezione delle partizioni indicano ad Athena soltanto come formattare i valori quando vengono generate le posizioni della partizione. I tipi specificati non modificano il tipo di chiave di partizione, nelle query, `datehour` e `day` sono di tipo `string`.

Quando una query include una condizione come `day = '2021/11/09'`, Athena analizza la stringa sul lato destro dell'espressione utilizzando il formato data specificato nella configurazione di proiezione della partizione. Una volta che Athena ha verificato che la data rientra nell'intervallo configurato, utilizza nuovamente il formato della data per inserire la data come stringa nel modello di posizione di archiviazione.

Allo stesso modo, per una condizione di query come `day > '2021/11/09'`, Athena analizza il lato destro e genera un elenco di tutte le date corrispondenti all'interno dell'intervallo configurato. Viene quindi utilizzato il formato della data per inserire ogni data nel modello di posizione di archiviazione per creare l'elenco delle posizioni delle partizioni.

Scrivi la stessa condizione come `day > '2021-11-09'` altrimenti `day > DATE '2021-11-09'` non funzionerà. Nel primo caso, il formato della data non corrisponde (notare i trattini anziché le barre) mentre nel secondo caso i tipi di dati non corrispondono.

# Come utilizzare prefissi personalizzati e partizionamento dinamico
<a name="partition-projection-kinesis-firehose-example-using-custom-prefixes-and-dynamic-partitioning"></a>

Firehose può essere configurato con [prefissi personalizzati](https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html) e [partizionamento dinamico](https://docs.aws.amazon.com/firehose/latest/dev/dynamic-partitioning.html). Grazie a queste funzionalità, è possibile configurare le chiavi Amazon S3 e impostare schemi di partizionamento che supportano meglio il proprio caso d'uso. È inoltre possibile utilizzare la proiezione delle partizioni con questi schemi di partizionamento e configurarli di conseguenza.

Ad esempio, è possibile utilizzare la funzione di prefisso personalizzato per ottenere chiavi Amazon S3 con date formattate in ISO anziché lo schema `yyyy/MM/dd/HH` di default.

È inoltre possibile combinare i prefissi personalizzati con il partizionamento dinamico per estrarre una proprietà come `customer_id` dai messaggi Firehose, come nell’esempio seguente.

```
prefix/!{timestamp:yyyy}-!{timestamp:MM}-!{timestamp:dd}/!{partitionKeyFromQuery:customer_id}/
```

Con quel prefisso Amazon S3, il flusso di consegna di Firehose scriverebbe oggetti su chiavi come `s3://amzn-s3-demo-bucket/prefix/2021-11-01/customer-1234/file.extension`. Per una proprietà come `customer_id` dove i valori potrebbero non essere noti in anticipo, è possibile utilizzare il tipo di proiezione della partizione `injected` e usare un'istruzione `CREATE TABLE` come la seguente:

```
CREATE EXTERNAL TABLE my_ingested_data3 (
 ...
)
...
PARTITIONED BY (
 day STRING,
 customer_id STRING
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.day.type" = "date",
 "projection.day.format" = "yyyy-MM-dd",
 "projection.day.range" = "2021-01-01,NOW",
 "projection.day.interval" = "1",
 "projection.day.interval.unit" = "DAYS",
 "projection.customer_id.type" = "injected",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${day}/${customer_id}/"
)
```

Quando si esegue una query su una tabella con una chiave di partizione di tipo `injected`, la query deve includere un valore per quella chiave di partizione. Una query per la tabella `my_ingested_data3` potrebbe essere simile alla seguente:

```
SELECT *
FROM my_ingested_data3
WHERE day BETWEEN '2021-11-01' AND '2021-11-30'
AND customer_id = 'customer-1234'
```

## Utilizzare il tipo DATE per la chiave di partizione del giorno
<a name="partition-projection-kinesis-firehose-example-iso-formatted-dates"></a>

Perché i valori per la chiave di partizione `day` sono formattati in ISO, è anche possibile utilizzare il tipo `DATE` per la chiave di partizione del giorno invece di `STRING`, come nel seguente esempio:

```
PARTITIONED BY (day DATE, customer_id STRING)
```

Quando si esegue una query, questa strategia consente di utilizzare le funzioni data sulla chiave di partizione senza analizzare o eseguire il casting, come nell'esempio seguente:

```
SELECT *
FROM my_ingested_data3
WHERE day > CURRENT_DATE - INTERVAL '7' DAY
AND customer_id = 'customer-1234'
```

**Nota**  
La specificazione di una chiave di partizione di tipo `DATE` presuppone che per creare chiavi Amazon S3 con date in formato ISO sia stata utilizzata la funzionalità di [prefisso personalizzato](https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html). Se utilizzi il formato predefinito di Firehose `yyyy/MM/dd/HH`, è necessario specificare la chiave di partizione di tipo `string` anche se la proprietà della tabella corrispondente è di tipo `date`, come mostra il seguente esempio:  

```
PARTITIONED BY ( 
  `mydate` string)
TBLPROPERTIES (
  'projection.enabled'='true', 
   ...
  'projection.mydate.type'='date',
  'storage.location.template'='s3://amzn-s3-demo-bucket/prefix/${mydate}')
```