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 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 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
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, ...] [ WHEREcondition]
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, ...] [ WHEREcondition]
È possibile fare riferimento utilizzando il iceberg_table modulo o utilizzare la notazione in 3 parti per il catalogo montato automaticamente. Vedi Referencing Iceberg tables in Amazon Redshift.<external_schema>.<external_table_name>
La clausola contenuta nella table_nameUSING clausola verrà utilizzata per unirsi alla tabella di destinazione per eliminare le righe che soddisfano la condizione. WHERE Può essere una tabella Iceberg o una tabella RMS Amazon Redshift.table_name
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, ...] ] UPDATEiceberg_table[ [ AS ] alias ] SET column = {expression} [,...] [ FROMfromlist] [ WHEREcondition]
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} [,...] [ FROMfromlist] [ WHEREcondition]
È possibile fare riferimento utilizzando il iceberg_table modulo o utilizzare la notazione in 3 parti per il catalogo montato automaticamente. Vedi 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 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 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 ]
Puoi anche usare una notazione in tre parti per i bucket di tabella 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 ]
È possibile fare riferimento utilizzando il target_iceberg_table modulo o utilizzare la notazione in 3 parti per il catalogo montato automaticamente. Vedi Referencing Iceberg tables in Amazon Redshift.<external_schema>.<external_table_name>
Può essere una tabella Iceberg o una tabella RMS Amazon Redshift.source_table
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.