Amazon Redshift 將不再支援在 2026 年 6 月 30 日之後使用 Python UDFs。我們將開始分階段強制執行。如需 Python 生命週期結束和遷移選項的詳細資訊,請參閱 2025 年 6 月 30 日發佈的部落格文章
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Redshift 中的 Apache Iceberg v3 功能
Amazon Redshift 支援 Apache Iceberg v3 資料表。Iceberg v3 引入預設資料欄值、資料列歷程追蹤和刪除向量。您可以建立新的 v3 資料表,或將現有的 v2 資料表升級至 v3。
Iceberg v3 資料表對查詢和 DML 操作 (INSERT、DELETE、UPDATE、MERGE) 使用與 v2 資料表相同的 SQL 語法。此頁面所述的功能是 Iceberg v3 特有的。
建立 Iceberg v3 資料表
若要建立 Iceberg v3 資料表,請在 TABLE PROPERTIES 子句'format-version'='3'中指定 :
CREATE TABLEexternal_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']);
範例:
CREATE TABLE my_schema.orders ( id int, status varchar DEFAULT 'pending', priority int DEFAULT 0 ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders/' TABLE PROPERTIES ('format-version'='3');
如果您未指定 format-version,Amazon Redshift 會將資料表建立為 Iceberg v2。
從 v2 升級到 v3
您可以將現有的 Iceberg v2 資料表升級至 v3:
ALTER TABLEiceberg_tableSET TABLE PROPERTIES ('format-version' = '3');
升級格式版本是僅限中繼資料的操作。不會重寫現有的資料檔案。現有的 v2 位置刪除檔案仍然有效,並在讀取期間套用。升級後的第一個寫入操作會為整個資料表產生資料列歷程值。在後續 DELETE、UPDATE 或 MERGE 操作中,Amazon Redshift 會將 v2 位置刪除合併為受操作影響之資料檔案的刪除向量。
重要
升級至 Iceberg v3 之前,請檢閱 限制一節,因為 v3 資料表尚不支援某些功能。由於不支援從 v3 降級到 v2,請確保不支援的功能不會影響您的工作負載,然後再繼續升級。
限制
-
您只能在 Amazon Redshift Serverless 叢集 (4 個 RPU 除外) 和使用 RG 執行個體類型的佈建叢集上使用 Iceberg v3。
-
您無法在 Iceberg v3 資料表中讀取或寫入複雜類型 (結構、清單、映射、變體)。
-
您無法在 Iceberg v3 資料表中使用下列資料類型:struct、list、 map、 variant、geometry、geography、binary、uuid、time、timestamp_ns、timestamptz_ns 和 unknown。
-
您無法使用包含等式刪除的 Iceberg v3 資料表。
-
您無法在 Iceberg v3 資料表上建立具體化視觀表。
-
將資料表升級至 v3 之後,Iceberg 的
timestamptz類型會映射到 Amazon Redshift TIMESTAMPTZ 類型,而不是 TIMESTAMP (用於 v2)。因此,您的查詢會傳回包含時區資訊的時間戳記。
預設資料欄值
只有 Iceberg v3 資料表才支援預設資料欄值。如果您在 Iceberg v2 資料表上指定預設值,Amazon Redshift 會傳回錯誤。
預設值會指定文字值,當沒有明確值時,資料欄會回到該值。如此一來,您可以將新的資料欄新增至現有的資料表,而無需重寫資料檔案。先前寫入的資料檔案的讀取會自動傳回新資料欄的預設值。當 DML 陳述式省略資料欄或指定 DEFAULT 做為值時,也會寫入預設值。
預設值僅支援常值。巢狀資料類型不支援預設值。
CREATE TABLE AS SELECT 不會繼承來源資料表的預設資料欄值。若要在新資料表上定義預設值,請在建立後使用 ALTER TABLE ALTER COLUMN SET DEFAULT。
定義資料表建立時的預設值
CREATE TABLEexternal_schema.table_name( column_name data_type DEFAULT literal_value [, ...] ) USING ICEBERG LOCATION '...' TABLE PROPERTIES ('format-version'='3');
使用預設新增資料欄
ALTER TABLEiceberg_tableADD COLUMN column_name data_type DEFAULT literal_value;
現有的資料檔案會傳回新增資料欄的預設值,而不需要資料重寫。
變更或移除預設值
ALTER TABLEiceberg_tableALTER COLUMN column_name SET DEFAULT literal_value; ALTER TABLEiceberg_tableALTER COLUMN column_name DROP DEFAULT;
SET DEFAULT 會變更現有資料欄的預設值。新的預設值適用於變更後寫入的資料檔案。現有的資料檔案會繼續使用先前的預設值。
DROP DEFAULT 會從資料欄移除預設值。此操作之後,新的寫入不會再為資料欄套用預設值。不包含資料欄的資料檔案會繼續傳回資料欄的初始預設值。
INSERT 行為
插入資料列而不指定具有預設值的資料欄時,預設值會寫入資料檔案。
SHOW TABLE
SHOW TABLE 會在其輸出中顯示預設值。
資料列譜系
資料列譜系僅支援 Iceberg v3 資料表。它提供兩個虛擬資料欄,可追蹤資料列身分和修改歷史記錄。這些欄由 Amazon Redshift 自動管理。您未設定其值。
虛擬資料欄
| 資料行 | 資料類型 | 說明 |
|---|---|---|
_row_id |
BIGINT | 唯一識別資料表中的每一列。在寫入操作時自動指派。 |
_last_updated_sequence_number |
BIGINT | 修改資料列之上次寫入操作的快照序號。 |
查詢資料列歷程
資料列歷程資料欄必須在 SELECT 清單中明確命名。它們不包含在 SELECT * 中。
SELECT _row_id, _last_updated_sequence_number, * FROM my_schema.my_iceberg_v3_table;
您可以在 WHERE、ORDER BY、GROUP BY 和 JOIN 子句中使用資料列歷程資料欄:
SELECT * FROM my_schema.my_iceberg_v3_table WHERE _last_updated_sequence_number >= 3 ORDER BY _row_id;
非 v3 資料表的行為
查詢非 Iceberg v3 資料表_row_id並_last_updated_sequence_number傳回 NULL 時。
v2 到 v3 升級之後的行為
對於從 Iceberg v2 升級到 v3 的資料表,資料列歷程值無法立即用於預先升級資料。_row_id 和 都會_last_updated_sequence_number傳回 NULL,直到升級後的第一個寫入操作為止,這會為整個資料表產生資料列歷程值。這是僅限中繼資料的操作,不會重寫現有的資料檔案。
寫入行為
Amazon Redshift 會在所有寫入操作 (INSERT、CTAS、UPDATE、MERGE) 上自動填入資料列譜系。每一列都會收到唯一的 _row_id,並_last_updated_sequence_number反映寫入資料列之遞交的快照序號。
限制
-
SELECT * 中不包含資料列譜系資料欄。
-
Iceberg v2 或更早版本的資料表不支援資料列譜系。
-
v2 至 v3 升級資料表中的預先升級資料會傳回兩個虛擬資料欄的 NULL,直到升級後的第一個寫入操作為止。
刪除向量
刪除向量是 Iceberg v3 用來追蹤資料列層級刪除的機制。它們取代 Iceberg v2 使用的位置刪除檔案。
當您在 Iceberg v3 資料表上執行 DELETE、UPDATE 或 MERGE 時,Amazon Redshift 會在刪除向量中記錄已刪除的資料列位置,而不是寫入單獨的位置刪除檔案。這是自動處理的。不需要變更 SQL 語法。
刪除向量的運作方式
刪除向量是一種壓縮點陣圖,可記錄已刪除資料檔案中的資料列位置。刪除向量存放在與資料表資料相同的 S3 位置的 Puffin 檔案中。每個資料檔案最多有一個刪除向量。
讀取 Iceberg v3 資料表時,Amazon Redshift 會自動套用刪除向量,以從查詢結果中排除已刪除的資料列。
位置刪除檔案的優勢
-
刪除向量比位置刪除檔案更精簡。
-
每個資料檔案的單一刪除向量可避免累積許多小型刪除檔案。
-
相同資料檔案上的後續刪除會產生新的刪除向量,其會將先前的刪除與新刪除的位置合併,以維護每個資料檔案的單一刪除向量。
-
由於刪除向量更精簡,並避免累積許多小型檔案,因此相較於 Iceberg v2 位置刪除檔案,讀取和寫入速度更快。
v2 到 v3 升級之後的行為
將資料表從 Iceberg v2 升級至 v3 之後,現有的 v2 位置刪除檔案仍然有效,並在讀取期間套用。在後續寫入操作 (DELETE、UPDATE 或 MERGE) 上,Amazon Redshift 會將現有的 v2 位置刪除合併為刪除向量,如 Iceberg 規格所定義。
限制
-
Iceberg v2 或更早版本的資料表不支援刪除向量。
-
Iceberg v3 資料表無法回到新寫入操作的位置刪除檔案。這表示 Iceberg v3 資料表可以讀取現有的位置刪除檔案,但無法新增新的位置刪除檔案。相反地,Iceberg v3 資料表只能使用刪除向量新增刪除。