creating-data-lake-table

creating-data-lake-table

熱門

使用 Amazon S3 Tables(s3tables API 命名空間)建立受管 Iceberg 資料表,具備自動壓縮與快照管理功能。設定資料表儲存桶、命名空間、資料表、結構描述、Glue 目錄註冊、分割區及 IAM 存取控制。觸發時機:建立資料表、資料湖資料表、分析資料表、結構化資料儲存、S3 Tables、Iceberg、Athena 資料表、分割策略、存取權限。請勿用於:匯入檔案(請使用 ingesting-into-data-lake)、向量儲存(請使用 storing-and-querying-vectors)、查詢現有資料表(請使用 querying-data-lake)、或尋找現有資料表(請使用 finding-data-lake-assets)。

2159星標
204分支
更新於 2026/7/28
SKILL.md
唯讀
名稱
creating-data-lake-table
描述

使用 Amazon S3 Tables(s3tables API 命名空間)建立受管 Iceberg 資料表,具備自動壓縮與快照管理功能。設定資料表儲存桶、命名空間、資料表、結構描述、Glue 目錄註冊、分割區及 IAM 存取控制。觸發時機:建立資料表、資料湖資料表、分析資料表、結構化資料儲存、S3 Tables、Iceberg、Athena 資料表、分割策略、存取權限。請勿用於:匯入檔案(請使用 ingesting-into-data-lake)、向量儲存(請使用 storing-and-querying-vectors)、查詢現有資料表(請使用 querying-data-lake)、或尋找現有資料表(請使用 finding-data-lake-assets)。

版本
1

使用 Amazon S3 Tables 建立資料湖資料表

概述

Amazon S3 Tables 提供受管的 Iceberg 資料表,具備自動壓縮與快照管理功能。可透過 Athena 及相容 Iceberg 的引擎進行查詢。

常見任務

連線時您必須使用 AWS MCP 伺服器工具,這些工具提供指令驗證、沙箱執行與稽核記錄。若 MCP 無法使用,則改用 AWS CLI。

決策指南

建立前,您必須檢查現有資源:

當使用者提及資料庫時,您必須執行 aws glue get-tables --database-name <NAME>

發現情況 處理方式
模糊的資料庫名稱(如「我們的分析資料庫」) 您必須停止。交由 finding-data-lake-assets 處理。
名稱相符但非 S3 Tables 的資料表 您必須停止。交由 finding-data-lake-assets 處理。在使用者確認前不得建立。
名稱相符的現有 S3 Tables 資料表 您必須檢查結構描述是否相符。若相容則重複使用,僅在使用者確認後才重新建立。
無相符資料表 繼續建立流程(步驟 1-8)。
使用者明確要求新的 S3 Tables 資料表 跳過檢查,直接建立。

建立路徑:

  • S3 中已有資料:先建立空資料表(步驟 1-8),再使用 ingesting-into-data-lake 技能。
  • Glue ETL 管線:先閱讀 references/table-creation-glue-etl.md,再執行步驟 1-6。
  • Lake Formation 存取控制:搜尋 AWS 文件中的 "S3 Tables integration with Lake Formation"

1. 驗證相依項目

限制條件:

  • 您必須檢查 AWS MCP 伺服器工具或 AWS CLI 是否可用,並在缺少時通知使用者
  • 您必須確認目標 AWS 區域,並使用 aws sts get-caller-identity 驗證憑證

2. 了解結構描述

  • 明確的結構描述:驗證 Iceberg 型別。
  • 模糊的描述:詢問欄位、型別、粒度。提出建議並確認。
  • 現有 S3 資料:僅從檔案標頭推斷結構描述。先建立空資料表,再使用 ingesting-into-data-lake 技能。

限制條件:

  • 您必須閱讀 references/best-practices.md 以了解 Iceberg 型別對應、分割區與命名規則。
  • 您必須事先詢問所有必要參數:資料表名稱、欄位、型別、分割策略。關於結構描述演進,請參閱 references/athena-ddl-path.md
  • 您必須全部使用小寫名稱——Glue 會拒絕大小寫混合的名稱並回報 GENERIC_INTERNAL_ERROR。命名空間與資料表名稱不得包含連字號。
  • 您應根據存取模式建議分割欄位。

3. 建立資料表儲存桶

名稱:3-63 個字元,小寫字母、數字、連字號。

aws s3tables create-table-bucket --name <BUCKET_NAME> --region <REGION>

記錄 table-bucket-arn。加密方式(預設 SSE-S3,可選 SSE-KMS)與儲存類別(STANDARD、INTELLIGENT_TIERING)在建立時設定。請參閱 references/best-practices.md

限制條件:

  • 您必須使用 aws s3tables list-table-buckets 檢查現有儲存桶,並請使用者選擇或建立新的。
  • 若使用 SSE-KMS,KMS 金鑰政策必須允許 S3 Tables 維護服務主體讀取資料。請搜尋 AWS 文件中的 "S3 Tables KMS key policy" 以取得所需政策。
  • 若儲存桶建立失敗,請參閱 references/best-practices.md 中的常見錯誤。

4. 建立命名空間

aws s3tables create-namespace --table-bucket-arn <ARN> --namespace <NAMESPACE>

限制條件:

  • 您必須先列出現有命名空間,並在相關時建議重複使用
  • 您必須使用小寫名稱,不含連字號

5. 建立 Glue 資料目錄整合

檢查 s3tablescatalog 是否存在(每個區域每個帳號只需建立一次):

aws glue get-catalog --catalog-id s3tablescatalog

若未找到,則建立(需要 glue:CreateCatalogglue:passConnection):

aws glue create-catalog --name "s3tablescatalog" --catalog-input '{
  "FederatedCatalog": {
    "Identifier": "arn:aws:s3tables:<REGION>:<ACCOUNT_ID>:bucket/*",
    "ConnectionName": "aws:s3tables"
  },
  "CreateDatabaseDefaultPermissions": [{"Principal": {"DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"}, "Permissions": ["ALL"]}],
  "CreateTableDefaultPermissions": [{"Principal": {"DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"}, "Permissions": ["ALL"]}],
  "AllowFullTableExternalDataAccess": "True"
}'

使用 aws glue get-catalogs --parent-catalog-id s3tablescatalog 驗證。

6. 設定存取控制

S3 Tables 使用 s3tables:* IAM 命名空間(非 s3:*)。

查詢主體權限(儲存桶政策):

  • s3tables:GetTableBuckets3tables:GetNamespaces3tables:GetTables3tables:GetTableMetadataLocations3tables:GetTableData

查詢主體權限(IAM 政策):

  • glue:GetCatalogglue:GetDatabaseglue:GetTable

您必須將範圍限定於正確的 ARN 模式。您必須閱讀 references/access-control.md 以取得確切的資源 ARN。

限制條件:

  • 您必須詢問使用者查詢主體的 ARN
  • 您不得授予超出必要的權限
  • 您不得自動建立 IAM 角色,應驗證現有角色並引導使用者

7. 建立資料表

情境 路徑
預設(任何使用者) S3 Tables API(如下)
使用者明確要求 SQL DDL Athena DDL(請參閱 references/athena-ddl-path.md
Glue ETL 管線 Spark DDL 透過 --conf 任務參數(非 spark.conf.set())。您必須閱讀 references/table-creation-glue-etl.md 以取得 --conf 字串。

預設:S3 Tables API:

aws s3tables create-table \
  --table-bucket-arn <ARN> \
  --namespace <NAMESPACE> \
  --name <TABLE_NAME> \
  --format ICEBERG \
  --metadata '<METADATA_JSON>'

Metadata JSON 必須巢狀於 "iceberg" 鍵下:

{"iceberg":{"schema":{"fields":[
  {"name":"order_date","type":"date","required":true},
  {"name":"customer_id","type":"string","required":true},
  {"name":"amount","type":"double","required":false}
]},
"partitionSpec":{"fields":[
  {"sourceId":1,"fieldId":1000,"transform":"month","name":"order_date_month"}
]}}}

限制條件:

  • partitionSpec.sourceId 必須參考有效的結構描述欄位 ID
  • 建立後若要進行結構描述演進,請使用 Athena DDL。請參閱 references/athena-ddl-path.md
  • 對於複雜型別(list、map、struct),您必須使用 schemaV2 並指定明確的欄位 ID。請參閱 references/best-practices.md
  • 您應搜尋 AWS 文件中的 "IcebergPartitionField S3 Tables" 以了解支援的分割轉換方式

8. 驗證與確認

您必須使用 aws s3tables get-table 驗證,並透過 Athena 使用 --query-execution-context '{"Catalog":"s3tablescatalog/<BUCKET_NAME>","Database":"<NAMESPACE>"}' 執行 DESCRIBE <table_name> 以確認可查詢性。請勿在 SQL 中加入目錄。呈現摘要:儲存桶 ARN、命名空間、資料表、結構描述、分割區。

疑難排解

錯誤 原因 修正
"Table location can not be specified" CREATE TABLE 中使用了 LOCATION 移除 LOCATION 子句。S3 Tables 會自動管理儲存位置。
AccessDeniedException 搭配 s3:* 政策 使用了 s3:* 而非 s3tables:* S3 Tables 使用 s3tables:* 命名空間。請更新 IAM 政策。

其他資源