Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊,請參閱部落格文章
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon Redshift 中參考 Iceberg 資料表
Amazon Redshift 提供多種方法來參考存放在資料湖中的 Apache Iceberg 資料表。您可以使用外部結構描述來建立包含 Iceberg 資料表之 Data Catalog 資料庫的參考,或使用三段式表示法直接存取自動掛載的目錄。
使用外部結構描述參考 Iceberg 資料表
外部結構描述可讓您從 Amazon Redshift 內參考 Data Catalog 中的資料表。當您建立外部結構描述時,您可以在 Amazon Redshift 資料庫與包含 Iceberg 資料表的特定 Data Catalog 資料庫之間建立連線。
若要建立 Iceberg 資料表的外部結構描述:
CREATE EXTERNAL SCHEMAschema_nameFROM DATA CATALOG DATABASE 'glue_database_name' IAM_ROLE 'arn:aws:iam::account-id:role/role-name';
建立外部結構描述後,您可以使用兩段式表示法查詢 Iceberg 資料表:
SELECT * FROMschema_name.iceberg_table_name;
您也可以將 Iceberg 資料表與本機 Amazon Redshift 資料表聯結:
SELECT r.customer_id, i.order_date, r.customer_name FROM local_customers r JOINschema_name.iceberg_ordersi ON r.customer_id = i.customer_id;
搭配自動掛載目錄使用三部分標記法
三部分表示法可讓您直接參考自動掛載目錄中的資料表,而無需建立外部結構描述。此方法在使用與 聯合的 Amazon S3 資料表儲存貯體時特別有用 AWS Lake Formation。如需有關設定自動掛載 Data Catalog 的資訊,請參閱使用自動掛載簡化 Amazon Redshift 中的外部物件存取 AWS Glue Data Catalog
三部分表示法的語法為:
"catalog_name".database_name.table_name
例如,若要在自動掛載的 Amazon S3 資料表目錄中查詢 Iceberg 資料表:
SELECT * FROM "my_table_bucket@s3tablescatalog".my_database.my_iceberg_table;
如需將 Amazon S3 資料表儲存貯體與 Amazon Redshift 整合的詳細資訊,請參閱《Amazon S3 使用者指南》中的將 S3 資料表與 Amazon Redshift 整合。 Amazon S3
您也可以參考自動掛載根目錄 下的資料表awsdatacatalog,該目錄可讓您直接存取在 中註冊的資料庫和資料表 AWS Glue Data Catalog:
SELECT * FROM awsdatacatalog.my_database.my_iceberg_table;
如需使用awsdatacatalog根目錄的詳細資訊,請參閱《Amazon Redshift 管理指南》中的查詢 AWS Glue Data Catalog 和《 AWS Lake Formation 開發人員指南》中的管理資料目錄命名空間。
您也可以使用 USE陳述式來設定 Amazon S3 資料表儲存貯體的預設目錄和資料庫:
USE "my_table_bucket@s3tablescatalog".my_database; SELECT * FROMmy_iceberg_table;
若要使用 Amazon S3 資料表儲存貯體設定結構描述解析的搜尋路徑:
USE "my_table_bucket@s3tablescatalog"; SET search_path TOmy_database; SELECT * FROMmy_iceberg_table;
注意
USE 陳述式 和 search_path僅支援 s3tablescatalog。它們無法與 搭配使用awsdatacatalog。若要參考 中的資料表awsdatacatalog,請使用完整的三部分表示法。
參考 Iceberg 資料表的最佳實務
Apache Iceberg 資料表是由多個檔案組成的單一邏輯實體:根中繼資料檔案 (metadata.json)、資訊清單清單、資訊清單檔案和資料檔案 (通常是 .parquet)。根中繼資料檔案做為進入點,其中包含組成資料表的所有其他檔案的參考。當您授予 Amazon Redshift 對 Iceberg 資料表的存取權時,Amazon Redshift 會使用根中繼資料檔案來探索和讀取所有參考的資料檔案。如果 Amazon Redshift 可以存取根中繼資料檔案,則會假設並要求存取所有基礎資料檔案。這與 Iceberg 的設計一致,其中資料表層級存取是預期的授權單位。
為了改善查詢效能,Amazon Redshift 會在記憶體中快取 Iceberg 中繼資料檔案 (包括根中繼資料檔案、資訊清單清單和資訊清單檔案)。根中繼資料檔案 (metadata.json) 會以可設定的間隔 (TTL) 針對 Amazon S3 重新驗證。TTL 過期後,Amazon Redshift 會對根中繼資料檔案執行 Amazon S3 HEAD 請求,以確認 IAM 角色仍然具有存取權,且檔案尚未修改。如果許可檢查失敗或檔案已變更,則會移出快取的項目,並從 Amazon S3 重新擷取中繼資料。由於根中繼資料檔案是所有資料表存取的進入點,因此此重新驗證會做為整個資料表的許可閘道。資訊清單清單和資訊清單檔案會在沒有獨立 TTL 重新驗證的情況下快取,其存取有效性衍生自根中繼資料許可檢查。這表示如果您撤銷 Iceberg 資料表上的 Amazon S3 許可,在使用快取中繼資料時,查詢可能會繼續成功最多 2 分鐘。
重要
Amazon S3 可讓您在個別物件層級設定許可,這表示在技術上可以授予 Iceberg 資料表中繼資料的存取權,同時限制存取其一些基礎資料檔案。這會產生許可不一致,這可能會導致 Amazon Redshift 中的查詢失敗或意外存取錯誤。
Amazon Redshift 會定期驗證快取根中繼資料檔案的存取權,但不會驗證或強制執行 Amazon S3 儲存貯體中中繼資料層級和data-file-level許可之間的一致性。客戶有責任確保許可一致地套用至構成 Iceberg 資料表的所有檔案。
若要避免這種情況,在 Amazon Redshift 中參考 Iceberg 資料表時,請考慮下列最佳實務:
-
使用描述性結構描述名稱 – 建立外部結構描述時,請使用可清楚指出資料來源和用途的名稱,例如
sales_data_lake或customer_analytics。 -
利用資料表統計資料 – 確保使用 為您的 Iceberg 資料表產生資料欄統計資料 AWS Glue ,以最佳化查詢效能。Amazon Redshift 使用這些統計資料進行查詢規劃和最佳化。
-
考量資料新鮮度 – 在您查詢時,其他服務可能會更新 Iceberg 資料表。Amazon Redshift 提供交易一致性,確保您在查詢執行期間看到一致的資料快照。
-
使用適當的 IAM 許可 – 確保您的 Amazon Redshift 叢集或工作群組具有必要的 IAM 許可,可存取存放 Iceberg 資料表的 Amazon S3 位置,以及資料目錄中繼資料。
-
資料表層級許可 – 在資料表層級授予許可,而不是在個別檔案層級授予許可。
-
統一許可 – 確保對 Iceberg 資料表的整個 Amazon S3 路徑進行統一存取,包括所有中繼資料、資訊清單和資料檔案。
-
避免限制性物件層級政策 – 請勿在 Iceberg 資料表字首內的個別 Parquet 檔案上設定限制性物件層級政策。
-
了解許可變更的快取 TTL – 當您撤銷 Iceberg 資料表上的 Amazon S3 許可時,查詢可能會繼續使用快取的根中繼資料,直到設定的 TTL 持續時間為止 (預設值:2 分鐘)。
-
監控查詢效能 – 使用 Amazon Redshift 查詢監控功能來追蹤針對 Iceberg 資料表的查詢效能,並視需要最佳化。
常見參考模式
下列範例示範參考 Iceberg 資料表的常見模式:
跨多個 Iceberg 資料表彙總資料:
SELECT region, SUM(sales_amount) as total_sales, COUNT(*) as transaction_count FROM data_lake.sales_transactions WHERE transaction_date >= '2024-01-01' GROUP BY region ORDER BY total_sales DESC;
將 Iceberg 資料表與本機 Amazon Redshift 資料表聯結:
SELECT c.customer_name, c.customer_tier, SUM(o.order_amount) as total_orders FROM customers c JOIN data_lake.order_history o ON c.customer_id = o.customer_id WHERE o.order_date >= CURRENT_DATE - INTERVAL '30 days' GROUP BY c.customer_name, c.customer_tier;
搭配複雜查詢使用三部分表示法:
WITH recent_orders AS ( SELECT customer_id, order_date, order_amount FROM "analytics_bucket@s3tablescatalog".ecommerce.orders WHERE order_date >= CURRENT_DATE - INTERVAL '7 days' ) SELECT customer_id, COUNT(*) as order_count, AVG(order_amount) as avg_order_value FROM recent_orders GROUP BY customer_id HAVING COUNT(*) > 1;