View a markdown version of this page

Comandi SQL - Amazon Redshift

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.

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

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 DELETEUPDATE, e. Tutte le altre istruzioni SQL, ad esempioALTER 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.

CREATE TABLE

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 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 i dati in modo incrociato. Regioni AWS

PARTITIONED BYdefinisce 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 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, gzipsnappy, euncompressed.

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

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 TABLEistruzione, tranne per il fatto che CREATE è seguita da un'SELECTistruzione 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

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 TABLEvisualizza l'CREATE TABLEistruzione per la tabella Iceberg. Il comando mostrerà i risultati appropriati in base al tipo di tabella. Di seguito è riportato un esempio dell'SHOW TABLEoutput 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

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

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.

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_namePuò 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

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.

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.

UPDATEpuò 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.

MERGE

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.

source_tablePuò 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 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

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 di file orfani. Per le tabelle Amazon S3, consulta Manutenzione delle tabelle.