Amazon Redshift non supporterà più l'uso delle UDF Python dopo il 30 giugno 2026. Inizieremo ad applicarlo per fasi. Per ulteriori informazioni sulla fine del ciclo di vita e sulle opzioni di migrazione di Python, consulta il post del
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 forniscono 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 prestazioni elevate per i carichi di lavoro di analisi. Utilizzando le tabelle Apache Iceberg, puoi organizzare e partizionare in modo efficiente i tuoi dati, controllare i formati e la compressione dei file e integrarti 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 la notazione dello schema esterna () o la 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 vuoi rimuovere una tabella da AWS Glue Data Catalog, puoi usare il DROP TABLE comando. Nota che questo rimuove solo la registrazione della tabella. I dati effettivi rimarranno in memoria finché non li elimini separatamente.
È inoltre possibile modificare i dati esistenti utilizzando i MERGE comandi DELETEUPDATE,, e. Per modificare le definizioni delle tabelle, ad esempio schema, specifiche delle partizioni e proprietà, vedereModifica delle definizioni delle tabelle. Altre istruzioni DDL non documentate non sono supportate per le 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 o v3.
-
La tabella deve utilizzare Parquet come formato dati predefinito.
-
La compressione dei metadati della tabella non deve essere 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 tabelle Iceberg in Amazon Redshift.
CREATE TABLE
CREATE TABLE [IF NOT EXISTS]<external_schema>.<table_name>( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES (['format-version'='<version>'] [, 'compression_type'='<compression_value>'])]
Puoi anche utilizzare la notazione in tre parti per i bucket di tabelle S3:
CREATE TABLE "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES (['format-version'='<version>'] [, 'compression_type'='<compression_value>'])]
Per il catalogo principale montato automaticamente: awsdatacatalog
CREATE TABLE awsdatacatalog.<database_name>.<table_name>( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG LOCATION 's3://your-bucket-name/prefix/' [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES (['format-version'='<version>'] [, 'compression_type'='<compression_value>'])]
Quando si utilizza la sintassi dello schema esterno, si noti che 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.<external_schema>
La LOCATION clausola definisce la posizione della tabella Iceberg appena creata. LOCATIONè obbligatorio per le tabelle create utilizzando schemi esterni o il awsdatacatalog catalogo principale. Dovrebbe essere una posizione vuota, il che significa che non esistono oggetti Amazon S3 che condividono lo stesso bucket e lo stesso prefisso. La regione del bucket Amazon S3 deve trovarsi nella stessa regione del cluster Amazon Redshift. Per i bucket di tabelle Amazon S3, LOCATION non può essere specificato poiché la posizione della tabella è determinata dal catalogo di tabelle Amazon S3 (). s3tablescatalog
Tuttavia, AWS fornisce un metodo per replicare i dati dalle tabelle Iceberg archiviate 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 tra. Regioni AWS
PARTITIONED BYdefinisce la partizione della tabella Iceberg. Amazon Redshift supporta tutte le trasformazioni di partizioni 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, vedete Partition Transforms
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 Iceberg. Le proprietà della tabella supportate sono format-version e. compression_type La format-version proprietà specifica la versione del formato della tabella Iceberg. I valori possibili sono '2' (impostazione predefinita) e. '3' La compression_type proprietà definisce la compressione predefinita del file di dati Parquet. Se non specificato, snappy viene utilizzato come codec di compressione. I valori possibili per compression_type sono:zstd,brotli, gzipsnappy, euncompressed.
Per le tabelle Iceberg v3, puoi specificare i valori predefiniti per le colonne utilizzando la parola chiave DEFAULT. I valori di colonna predefiniti sono supportati solo per le tabelle Iceberg v3. Amazon Redshift restituisce un errore se si specifica un valore predefinito su una tabella Iceberg v2. Solo i valori letterali sono supportati come valori predefiniti.
CREATE TABLE<external_schema>.<table_name>( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG LOCATION 's3://your-bucket-name/prefix/' [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('format-version'='3' [, 'compression_type'='<compression_value>'])];
Esempi con valori predefiniti:
-- External schema notation CREATE TABLE my_external_schema.orders ( order_id INT, status VARCHAR DEFAULT 'pending', region VARCHAR DEFAULT 'us-east-1' ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders/' TABLE PROPERTIES ('format-version'='3'); -- Three-part notation (awsdatacatalog / Glue) CREATE TABLE awsdatacatalog.my_glue_db.orders ( order_id INT, status VARCHAR DEFAULT 'pending', region VARCHAR DEFAULT 'us-east-1' ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders/' TABLE PROPERTIES ('format-version'='3'); -- Three-part notation (S3 Table Buckets) CREATE TABLE "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders ( order_id INT, status VARCHAR DEFAULT 'pending', region VARCHAR DEFAULT 'us-east-1' ) USING ICEBERG TABLE PROPERTIES ('format-version'='3');
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 in 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 utilizzare la notazione in tre parti per creare tabelle in 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 delle query. SELECT
Qui non è più possibile specificare i tipi di dati con la CREATE TABLE clausola, poiché la SELECT query determina i tipi di dati delle colonne.
Se la SELECT query fallisce per qualsiasi motivo, questa avrà esito negativo e la tabella Iceberg non verrà creata.
Per le tabelle Iceberg v3, specificare 'format-version'='3' nella clausola TABLE PROPERTIES. I valori predefiniti delle colonne non vengono ereditati dalla tabella di origine.
-- External schema notation CREATE TABLE my_external_schema.orders_backup ( order_id, status, region ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders-backup/' TABLE PROPERTIES ('format-version'='3') AS SELECT order_id, status, region FROM my_external_schema.orders; -- Three-part notation (awsdatacatalog / Glue) CREATE TABLE awsdatacatalog.my_glue_db.orders_backup ( order_id, status, region ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders-backup/' TABLE PROPERTIES ('format-version'='3') AS SELECT order_id, status, region FROM awsdatacatalog.my_glue_db.orders; -- Three-part notation (S3 Table Buckets) CREATE TABLE "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders_backup ( order_id, status, region ) USING ICEBERG TABLE PROPERTIES ('format-version'='3') AS SELECT order_id, status, region FROM "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders;
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 i 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, la LOCATION clausola verrà omessa nei risultati. SHOW TABLE
Per le tabelle Iceberg v3, SHOW TABLE visualizza i valori delle colonne predefiniti nel relativo output.
SHOW TABLE my_external_schema.orders; -- Output includes the default values in the column definitions: CREATE TABLE my_external_schema.orders ( id int, status varchar DEFAULT 'active', priority int DEFAULT 0 ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders/' TABLE PROPERTIES ('format-version'='3');
Dopo aver creato le tabelle, puoi aggiungere dati usando: 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) -- Using three-part notation for the awsdatacatalog root catalog: INSERT INTO awsdatacatalog.<database_name>.<table_name>[(column_name [, ...])] VALUES (...) INSERT INTO awsdatacatalog.<database_name>.<table_name>[(column_name [, ...])] (SELECT query)
Puoi creare una tabella Iceberg INSERT INTO esistente usando la sintassi precedente. Se viene utilizzata la VALUES clausola, si forniscono i valori per le colonne elencate dacolumn_name, o tutte le colonne se la column_name parte viene omessa.
Quando i dati vengono inseriti nella tabella partizionata, le nuove righe vengono distribuite in base alle specifiche di partizione predefinite. Se per qualsiasi motivo la SELECT query fallisce, la query avrà esito negativo e nessun dato verrà inserito nella tabella Iceberg.
Per le tabelle Iceberg v3 con valori di colonna predefiniti, se una colonna con un valore predefinito viene omessa dall'istruzione INSERT o viene specificato DEFAULT come valore, il valore predefinito viene scritto nel file di dati.
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, ...] [ WHEREcondition]
È inoltre possibile utilizzare la notazione in tre parti per i bucket di tabelle S3:
[ WITH [RECURSIVE]common_table_expression[,common_table_expression, ...] ] DELETE [ FROM ] "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>[ { USING }table_name, ...] [ WHEREcondition]
Per il catalogo principale montato automaticamente: awsdatacatalog
[ WITH [RECURSIVE]common_table_expression[,common_table_expression, ...] ] DELETE [ FROM ] awsdatacatalog.<database_name>.<table_name>[ { USING }table_name, ...] [ WHEREcondition]
È possibile farvi riferimento utilizzando il iceberg_table modulo o utilizzare la notazione in 3 parti per il catalogo montato automaticamente. Consulta Referencing Iceberg tables in Amazon Redshift. <external_schema>.<external_table_name>
La USING clausola in the verrà utilizzata per unirsi alla tabella di destinazione per eliminare le righe che soddisfano la condizione. table_nameWHERE Può essere una tabella Iceberg o una tabella Amazon Redshift RMS.table_name
Poiché Iceberg utilizza uno schema di partizione nascosto, l'utente può utilizzare una DELETE query per rimuovere le partizioni, ottenendo lo stesso effetto delle tabelle Hive. ALTER TABLE ... DROP
PARTITION ...
Ad esempio, considera una tabella Iceberg partizionata come la seguente:
CREATE TABLE my_external_schema.lineitem (l_item_id int, l_ship_date varchar, ... ) USING ICEBERG LOCATION ... PARTITIONED BY l_ship_date;
Quindi puoi rimuovere una partizione utilizzando una query come la seguente:
DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231';
Per query come questa, Amazon Redshift ottimizzerà l'esecuzione in modo da eseguire solo operazioni relative ai metadati e cortocircuitando 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, ...] ] UPDATEiceberg_table[ [ AS ] alias ] SET column = {expression} [,...] [ FROMfromlist] [ WHEREcondition]
È inoltre possibile utilizzare la notazione in tre parti per i bucket di tabelle S3:
[ WITH [RECURSIVE]common_table_expression[,common_table_expression, ...] ] UPDATE "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>[ [ AS ] alias ] SET column = {expression} [,...] [ FROMfromlist] [ WHEREcondition]
Per il catalogo principale montato automaticamente: awsdatacatalog
[ WITH [RECURSIVE]common_table_expression[,common_table_expression, ...] ] UPDATE awsdatacatalog.<database_name>.<table_name>[ [ AS ] alias ] SET column = {expression} [,...] [ FROMfromlist] [ WHEREcondition]
È possibile farvi riferimento utilizzando il iceberg_table modulo o utilizzare la notazione in 3 parti per il catalogo montato automaticamente. Consulta Referencing Iceberg tables in Amazon Redshift. <external_schema>.<external_table_name>
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 alla specifica della partizione corrente, la nuova riga aggiornata verrà inserita nella nuova partizione in base al valore appena aggiornato.
Ad esempio, considera una tabella Iceberg partizionata come la seguente:
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 esegui la seguente query di aggiornamento:
UPDATE my_external_schema.lineitem SET l_ship_date = '20260101' WHERE l_item_id = 10099;
la riga con l_item_id 10099 si sposta dalla partizione 20251231 alla nuova partizione. 20260101
È anche importante notare che è possibile che UPDATE abbia più valori 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 della tabella RMS. Per ulteriori informazioni, fare riferimento a https://docs.aws.amazon.com/redshift/latest/dg/r_error_on_nondeterministic_update.html error_on_nondeterministic_update.
MERGE
La MERGE query unisce in modo condizionale le righe di una tabella di origine in una tabella di destinazione. Condivide la stessa sintassi di MERGE interrogazione della tabella RMS esistente:
MERGE INTOtarget_iceberg_tableUSINGsource_table[ [ AS ]alias] ONmatch_condition[ WHEN MATCHED THEN { UPDATE SETcol_name= {expr} [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ (col_name[,...] ) ] VALUES ( {expr} [, ...] ) | REMOVE DUPLICATES ]
È inoltre possibile utilizzare la notazione in tre parti per i bucket di tabelle S3:
MERGE INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>USINGsource_table[ [ AS ]alias] ONmatch_condition[ WHEN MATCHED THEN { UPDATE SETcol_name= {expr} [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ (col_name[,...] ) ] VALUES ( {expr} [, ...] ) | REMOVE DUPLICATES ]
Per il catalogo principale montato automaticamente: awsdatacatalog
MERGE INTO awsdatacatalog.<database_name>.<table_name>USINGsource_table[ [ AS ]alias] ONmatch_condition[ WHEN MATCHED THEN { UPDATE SETcol_name= {expr} [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ (col_name[,...] ) ] VALUES ( {expr} [, ...] ) | REMOVE DUPLICATES ]
È possibile farvi riferimento utilizzando il target_iceberg_table modulo o utilizzare la notazione in 3 parti per il catalogo montato automaticamente. Consulta Referencing Iceberg tables in Amazon Redshift. <external_schema>.<external_table_name>
Può essere una tabella Iceberg o una tabella Amazon Redshift RMS.source_table
Quando REMOVE DUPLICATES viene utilizzato, il MERGE comando utilizza la modalità semplificata. Per maggiori dettagli sulla modalità semplificata, fate riferimento al documento di MERGE comando originale.
Durante l'esecuzione MERGE della query, Amazon Redshift genera e archivia file di dati intermedi nella posizione della tabella di destinazione. Questi file verranno raccolti come spazzatura 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 Garbage Collection fallisce, si verificherebbe un errore di autorizzazione insufficiente. Per le tabelle Amazon S3, la garbage collection è 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, usate il DROP TABLE comando:
DROP TABLE<external_schema>.<table_name>
Puoi anche usare la notazione in tre parti con i 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 nella posizione della tabella. Puoi utilizzare le funzionalità AWS Glue e le tabelle di Amazon S3 per rimuovere i file orfani. Per AWS Glue, consulta Eliminazione di file orfani. Per le tabelle Amazon S3, consulta Manutenzione delle tabelle.