

 Amazon Redshift non supporterà più la creazione di nuovi Python UDFs a partire dalla Patch 198. Python esistente UDFs continuerà a funzionare fino al 30 giugno 2026. Per ulteriori informazioni, consulta il [post del blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

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

# Comandi SQL
<a name="iceberg-writes-sql-syntax"></a>

Le tabelle Apache Iceberg in Amazon Redshift offrono un modo efficace per gestire set di dati analitici di grandi dimensioni nel tuo data lake. Queste tabelle supportano le transazioni ACID, l'evoluzione degli schemi e le funzionalità di viaggio nel tempo, mantenendo al contempo prestazioni elevate per i carichi di lavoro di analisi. Utilizzando le tabelle Apache Iceberg, è possibile organizzare e partizionare in modo efficiente i dati, controllare i formati e la compressione dei file e integrarsi perfettamente con altri servizi. AWS 

È possibile creare tabelle Iceberg partizionate e non partizionate utilizzando i comandi and. `CREATE TABLE ... USING ICEBERG` `CREATE TABLE ... USING ICEBERG AS SELECT` È possibile fare riferimento alle tabelle Iceberg utilizzando una notazione dello schema esterna () o una notazione in tre parti (). `external_schema.table_name` `"catalog_name".database_name.table_name` Gli esempi in questa sezione illustrano entrambi i metodi.

Dopo aver creato una tabella, è possibile aggiungere dati utilizzando `INSERT` i comandi standard. Tieni presente che, sebbene Amazon Redshift funzioni con molti tipi di dati Iceberg, potresti dover convertire alcuni formati di dati quando inserisci informazioni. 

Puoi visualizzare le tabelle Iceberg usando il comando. `SHOW TABLES` Se si desidera rimuovere una tabella da AWS Glue Data Catalog, è possibile utilizzare il `DROP TABLE` comando. Nota che questo rimuove solo la registrazione della tabella. I dati effettivi rimarranno in archiviazione finché non li elimini separatamente.

È inoltre possibile modificare i dati esistenti utilizzando `MERGE` i comandi `DELETE``UPDATE`, e. Tutte le altre istruzioni SQL, ad esempio`ALTER TABLE`, non sono ancora supportate nelle tabelle Iceberg.

È possibile scrivere in una tabella Iceberg non creata da Amazon Redshift. Tuttavia, ci sono alcune limitazioni:
+ La tabella deve essere una tabella Iceberg v2.
+ La tabella deve utilizzare Parquet come formato dati predefinito.
+ La tabella non deve avere la compressione dei metadati impostata su True.
+ La tabella non deve essere abilitata Write-Audit-Publish (WAP).

Le seguenti sezioni illustrano la sintassi SQL per creare, inserire, modificare e gestire le tabelle Iceberg in Amazon Redshift.

**Contents**
+ [CREATE TABLE](#iceberg-writes-create-table)
+ [CREATE TABLE AS SELECT](#iceberg-writes-create-table-as-select)
+ [SHOW TABLE](#iceberg-writes-show-table)
+ [INSERT INTO](#iceberg-writes-insert-into)
+ [DELETE](#iceberg-writes-delete)
+ [UPDATE](#iceberg-writes-update)
+ [MERGE](#iceberg-writes-merge)
+ [DROP TABLE](#iceberg-writes-drop-table)

## CREATE TABLE
<a name="iceberg-writes-create-table"></a>

```
CREATE TABLE [IF NOT EXISTS] {{<external_schema>}}.{{<table_name>}} (
  column_name data_type [, ...]
)
USING ICEBERG
[LOCATION 's3://{{your-bucket-name}}/prefix/']
[PARTITIONED BY [[column_name | transform_function]], ...]
[TABLE PROPERTIES ('compression_type'='<compression_value>')]
```

Puoi anche usare una notazione in tre parti per i bucket di tabelle S3:

```
CREATE TABLE "{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}} (
  column_name data_type [, ...]
)
USING ICEBERG
[PARTITIONED BY [[column_name | transform_function]], ...]
[TABLE PROPERTIES ('compression_type'='<compression_value>')]
```

Nota che `{{<external_schema>}}` deve essere un nome di schema esterno esistente in cui verrà creata la tabella esterna. Per ulteriori informazioni su come creare e gestire schemi esterni, consulta [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html) nella documentazione di Amazon Redshift.

La `LOCATION` clausola definisce la posizione della tabella per questa tabella Iceberg appena creata. Per le tabelle Amazon S3, `LOCATION` non può essere specificato poiché la posizione della tabella è determinata dal catalogo delle tabelle Amazon S3 (). `s3tablescatalog` 

In tutti gli altri casi, `LOCATION` è obbligatorio e deve essere una posizione vuota, il che significa che non ci sono oggetti Amazon S3 esistenti che condividono lo stesso bucket e lo stesso prefisso. Tieni presente che la regione del bucket Amazon S3 deve trovarsi nella stessa regione del cluster Amazon Redshift. 

Tuttavia, AWS fornisce un metodo per replicare i dati dalle tabelle Iceberg archiviate in una AWS Glue Data Catalog in una Regione AWS diversa Regione AWS, che consente di replicare la scrittura in una regione diversa. Per ulteriori informazioni, consulta [Replicare](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/best-practices-workloads.html#workloads-replication) i dati in modo incrociato. Regioni AWS

`PARTITIONED BY`definisce la partizione della tabella Iceberg. Amazon Redshift supporta tutte le trasformazioni di partizione Iceberg v2 ad eccezione di. `void` Ecco l'elenco delle trasformazioni supportate:
+ **identità**
+ **secchio [N]**
+ **troncare [W]**
+ **anno**
+ **mese**
+ **giorno**
+ **ora**

Per le definizioni complete di queste trasformazioni e dei tipi di dati compatibili, consulta [Partition Transforms](https://iceberg.apache.org/spec/#partition-transforms) nella documentazione di Apache Iceberg.

Supporta il partizionamento a più livelli. `PARTITIONED BY` Ad esempio, puoi esegui il seguente comando:

```
CREATE TABLE ...
USING ICEBERG
LOCATION ...
PARTITIONED BY (bucket(16, id), year(ship_date));
```

Tuttavia, Amazon Redshift non supporta l'utilizzo di una singola colonna in più di una trasformazione. Ad esempio, la seguente sintassi non è supportata:

```
CREATE TABLE ...
USING ICEBERG
LOCATION ...
PARTITIONED BY (bucket(16, ship_date), year(ship_date));
```

La `TABLE PROPERTIES` clausola definisce le proprietà aggiuntive della tabella per questa tabella Iceberg. L'unica proprietà della tabella che supportiamo è quella `compression_type` che definisce la compressione predefinita dei file di dati di Parquet. Se questo non è specificato, `snappy` viene utilizzato come codec di compressione. I valori possibili per `compression_type` sono:`zstd`,`brotli`, `gzip``snappy`, e`uncompressed`.

**Nota**  
`CREATE TABLE ... LIKE ...`non è supportato per le tabelle Iceberg. Inoltre, le tabelle Iceberg non supportano i vincoli di colonna e gli attributi di colonna come fa la tabella RMS.

In alternativa, puoi creare e popolare una tabella Iceberg con un'unica operazione utilizzando: `CREATE TABLE AS SELECT`

## CREATE TABLE AS SELECT
<a name="iceberg-writes-create-table-as-select"></a>

```
CREATE TABLE {{<external_schema>}}.{{<table_name>}} [(
  column_name[, ...]
)]
USING ICEBERG
[LOCATION 's3://{{your-bucket-name}}/prefix/']
[PARTITIONED BY [[column_name | transform_function]], ...]
[TABLE PROPERTIES ('compression_type'='{{<compression-value>}}')]
AS
SELECT query
```

Puoi anche usare la notazione in tre parti per creare tabelle nei cataloghi montati automaticamente:

```
CREATE TABLE "{{<catalog_name>}}".{{<database_name>}}.{{<table_name>}} [(
  column_name[, ...]
)]
USING ICEBERG
[LOCATION 's3://{{your-bucket-name}}/prefix/']
[PARTITIONED BY [[column_name | transform_function]], ...]
[TABLE PROPERTIES ('compression_type'='{{<compression-value>}}')]
AS
SELECT query
```

È simile all'`CREATE TABLE`istruzione, tranne per il fatto che `CREATE` è seguita da un'`SELECT`istruzione per popolare la tabella con i risultati della query. `SELECT`

La `CREATE TABLE` clausola qui non consente più di specificare i tipi di dati poiché i tipi di dati delle colonne verranno decisi `SELECT` dalla query.

Se la `SELECT` query fallisce per qualsiasi motivo, questa avrà esito negativo e la tabella Iceberg non verrà creata.

Puoi visualizzare la struttura delle tue tabelle Iceberg usando: `SHOW TABLE`

## SHOW TABLE
<a name="iceberg-writes-show-table"></a>

```
SHOW TABLE {{<external_schema>}}.{{<table_name>}}
```

Puoi anche usare la notazione in tre parti con cataloghi montati automaticamente:

```
SHOW TABLE "{{<catalog_name>}}".{{<database_name>}}.{{<table_name>}}
```

`SHOW TABLE`visualizza l'`CREATE TABLE`istruzione per la tabella Iceberg. Il comando mostrerà i risultati appropriati in base al tipo di tabella. Di seguito è riportato un esempio dell'`SHOW TABLE`output per la tabella Iceberg:

```
CREATE TABLE my_schema.items (id int, price decimal(5, 2))
USING ICEBERG
LOCATION 's3://my_s3_bucket/items/'
PARTITIONED BY (bucket(16, id))
TABLE PROPERTIES ('compression_type'='snappy')
```

**Nota**  
Per le tabelle Amazon S3, poiché la posizione della tabella è gestita dal catalogo di tabelle Amazon S3, `LOCATION` la clausola verrà omessa nei risultati. `SHOW TABLE`

Dopo aver creato le tabelle, puoi aggiungere dati utilizzando: `INSERT INTO`

## INSERT INTO
<a name="iceberg-writes-insert-into"></a>

```
INSERT INTO {{<external_schema>}}.{{<table_name>}} [(column_name [, ...])] VALUES (...)
INSERT INTO {{<external_schema>}}.{{<table_name>}} [(column_name [, ...])] (SELECT query)

-- Using three-part notation for S3 table buckets:
INSERT INTO "{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}} [(column_name [, ...])] VALUES (...)
INSERT INTO "{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}} [(column_name [, ...])] (SELECT query)
```

È possibile creare `INSERT INTO` una tabella Iceberg utilizzando la sintassi precedente. Se viene utilizzata una `VALUES` clausola, si forniscono i valori per le colonne elencate da `column_name` o per tutte le colonne se viene omessa `column_name` una parte.

Quando i dati vengono inseriti in una tabella partizionata, le nuove righe vengono distribuite in base alla specifica di partizione predefinita. Se per qualsiasi motivo la `SELECT` query fallisce, la query avrà esito negativo e nessun dato verrà inserito nella tabella Iceberg.

## DELETE
<a name="iceberg-writes-delete"></a>

La `DELETE` query per la tabella Iceberg utilizza la `DELETE` sintassi esistente nella tabella RMS:

```
[ WITH [RECURSIVE] {{common_table_expression}} [, {{common_table_expression}} , ...] ]
DELETE [ FROM ] {{iceberg_table}}
[ { USING } {{table_name, ...}} ] [ WHERE {{condition}} ]
```

Puoi anche usare una notazione in tre parti per i bucket di tabella S3:

```
[ WITH [RECURSIVE] {{common_table_expression}} [, {{common_table_expression}} , ...] ]
DELETE [ FROM ] "{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}}
[ { USING } {{table_name, ...}} ] [ WHERE {{condition}} ]
```

`{{iceberg_table}}`È possibile fare riferimento utilizzando il `{{<external_schema>}}.{{<external_table_name>}}` modulo o utilizzare la notazione in 3 parti per il catalogo montato automaticamente. Vedi [Referencing Iceberg tables in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/referencing-iceberg-tables.html).

La clausola contenuta `{{table_name}}` nella `USING` clausola verrà utilizzata per unirsi alla tabella di destinazione per eliminare le righe che soddisfano la condizione. `WHERE` `{{table_name}}`Può essere una tabella Iceberg o una tabella RMS Amazon Redshift.

Poiché Iceberg utilizza uno schema di partizioni nascosto, l'utente può utilizzare la `DELETE` query per rimuovere le partizioni, ottenendo lo stesso effetto delle tabelle Hive. `ALTER TABLE ... DROP PARTITION ...`

Ad esempio, quando abbiamo partizionato la tabella Iceberg come segue:

```
CREATE TABLE my_external_schema.lineitem
(l_item_id int,
 l_ship_date varchar,
 ...
)
USING ICEBERG
LOCATION ...
PARTITIONED BY l_ship_date;
```

Quindi possiamo rimuovere facilmente una partizione usando una query come questa:

```
DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231';
```

Per query come questa, Amazon Redshift ottimizzerà l'esecuzione per eseguire solo operazioni con metadati e cortocircuitare l'esecuzione. Pertanto, a differenza delle normali `DELETE` query, la query di eliminazione dei soli metadati non mostra le fasi di esecuzione in: `EXPLAIN`

```
explain DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231';

 QUERY PLAN
------------
"XN Seq Scan Metadata of my_external_schema.lineitem location: "s3://s3-path//table-location" format:ICEBERG (cost=0.00..0.01 rows=0 width=0)"
(0 rows)
```

## UPDATE
<a name="iceberg-writes-update"></a>

La sintassi della `UPDATE` query per la tabella Iceberg è molto simile alla `UPDATE` sintassi esistente per la tabella RMS:

```
[ WITH [RECURSIVE] {{common_table_expression}} [, {{common_table_expression}} , ...] ]
UPDATE {{iceberg_table}} [ [ AS ] alias ] SET column = { {{expression}} } [,...]
[ FROM {{fromlist}} ]
[ WHERE {{condition}} ]
```

Puoi anche usare una notazione in tre parti per i bucket di tabella S3:

```
[ WITH [RECURSIVE] {{common_table_expression}} [, {{common_table_expression}} , ...] ]
UPDATE "{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}} [ [ AS ] alias ] SET column = { {{expression}} } [,...]
[ FROM {{fromlist}} ]
[ WHERE {{condition}} ]
```

`{{iceberg_table}}`È possibile fare riferimento utilizzando il `{{<external_schema>}}.{{<external_table_name>}}` modulo o utilizzare la notazione in 3 parti per il catalogo montato automaticamente. Vedi [Referencing Iceberg tables in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/referencing-iceberg-tables.html).

Puoi aggiornare una tabella facendo riferimento alle informazioni presenti in altre tabelle. Elenca queste altre tabelle nella clausola FROM o utilizza una sottoquery come parte della condizione WHERE. Le tabelle di origine possono essere tabelle Iceberg o tabelle Amazon Redshift RMS.

`UPDATE`può essere eseguito anche su una tabella partizionata. Quando si `UPDATE` modificano i valori delle colonne che appartengono alle specifiche della partizione corrente, la nuova riga aggiornata viene inserita nella nuova partizione in base al valore appena aggiornato.

Ad esempio, quando abbiamo una tabella Iceberg partizionata come di seguito:

```
CREATE TABLE my_external_schema.lineitem
(l_item_id int,
 l_ship_date varchar,
 ...
)
USING ICEBERG
LOCATION ...
PARTITIONED BY l_ship_date;

INSERT INTO my_external_schema.lineitem VALUES (10099, '20251231', ...);
```

E quando eseguiamo la seguente query di aggiornamento:

```
UPDATE my_external_schema.lineitem SET l_ship_date = '20260101'
WHERE l_item_id = 10099;
```

sposteremo questa riga con `l_item_id` 10099 dalla partizione `20251231` alla nuova partizione. `20260101`

È anche importante notare che è possibile avere più valori `UPDATE` candidati. Considera la seguente domanda:

```
CREATE TABLE my_ext_schema.t1(x1 int, y1 int) USING ICEBERG LOCATION ...;
CREATE TABLE my_ext_schema.t2(x2 int, y2 int) USING ICEBERG LOCATION ...;
INSERT INTO my_ext_schema.t1 VALUES (1,10), (2,20), (3,30);
INSERT INTO my_ext_schema.t2 VALUES (2,40), (2,50);
UPDATE my_ext_schema.t1 SET y1=y2 FROM my_ext_schema.t2 WHERE x1=x2;
```

In questo caso, y1 può essere 40 o 50. Il risultato non è deterministico. È possibile impostare il parametro di configurazione su true `error_on_nondeterministic_update` per forzare l'errore di interrogazione in questo caso. Ciò è coerente con il `UPDATE` comportamento esistente delle tabelle RMS. Per ulteriori informazioni, consulta [error\_on\_nondeterministic\_update](https://docs.aws.amazon.com/redshift/latest/dg/r_error_on_nondeterministic_update.html).

## MERGE
<a name="iceberg-writes-merge"></a>

La `MERGE` query unisce in modo condizionale le righe da una tabella di origine a una tabella di destinazione. Condivide la stessa sintassi di `MERGE` interrogazione della tabella RMS esistente:

```
MERGE INTO {{target_iceberg_table}} USING {{source_table}} [ [ AS ] {{alias}} ]
ON {{match_condition}}
[ WHEN MATCHED THEN { UPDATE SET {{col_name}} = { {{expr}} } [,...] | DELETE }
  WHEN NOT MATCHED THEN INSERT [ ( {{col_name}} [,...] ) ]
  VALUES ( { {{expr}} } [, ...] )
| REMOVE DUPLICATES ]
```

Puoi anche usare una notazione in tre parti per i bucket di tabella S3:

```
MERGE INTO "{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}} USING {{source_table}} [ [ AS ] {{alias}} ]
ON {{match_condition}}
[ WHEN MATCHED THEN { UPDATE SET {{col_name}} = { {{expr}} } [,...] | DELETE }
  WHEN NOT MATCHED THEN INSERT [ ( {{col_name}} [,...] ) ]
  VALUES ( { {{expr}} } [, ...] )
| REMOVE DUPLICATES ]
```

`{{target_iceberg_table}}`È possibile fare riferimento utilizzando il `{{<external_schema>}}.{{<external_table_name>}}` modulo o utilizzare la notazione in 3 parti per il catalogo montato automaticamente. Vedi [Referencing Iceberg tables in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/referencing-iceberg-tables.html).

`{{source_table}}`Può essere una tabella Iceberg o una tabella RMS Amazon Redshift.

Quando `REMOVE DUPLICATES` viene utilizzato, il `MERGE` comando utilizza la modalità semplificata. Per maggiori dettagli sulla modalità semplificata, consultate il documento di `MERGE` [comando](https://docs.aws.amazon.com/redshift/latest/dg/r_MERGE.html) originale.

Durante l'esecuzione della `MERGE` query, Amazon Redshift genera e archivia file di dati intermedi nella posizione della tabella di destinazione. Questi file verranno raccolti come immondizia alla fine della query. Per questo motivo, la `MERGE` query richiederebbe `DELETE` l'autorizzazione sul bucket Amazon S3 per funzionare correttamente. Se l'operazione di raccolta dei rifiuti fallisce, si verificherebbe un errore di autorizzazione insufficiente. Per le tabelle Amazon S3, la raccolta dei rifiuti è gestita dal servizio di tabelle Amazon S3. Quindi non è `DELETE` richiesta l'autorizzazione per eseguire la query. `MERGE`

## DROP TABLE
<a name="iceberg-writes-drop-table"></a>

Per rimuovere una tabella Iceberg dal catalogo, usa il `DROP TABLE` comando:

```
DROP TABLE {{<external_schema>}}.{{<table_name>}}
```

Puoi anche usare la notazione in tre parti con cataloghi montati automaticamente:

```
DROP TABLE "{{<catalog_name>}}".{{<database_name>}}.{{<table_name>}}
```

L'eliminazione di una tabella Iceberg è un'operazione che riguarda solo i metadati. Rimuove la voce della tabella da AWS Glue Data Catalog un catalogo di tabelle Amazon S3, se si tratta di una tabella Amazon S3. Amazon Redshift non pulisce o elimina alcun file di dati o file di metadati esistente sotto la posizione della tabella. Puoi utilizzare le funzionalità delle tabelle AWS Glue Amazon S3 per rimuovere file orfani. Per AWS Glue, consulta [Eliminazione](https://docs.aws.amazon.com/glue/latest/dg/orphan-file-deletion.html) di file orfani. Per le tabelle Amazon S3, consulta Manutenzione delle tabelle[.](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-maintenance.html)