本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立 Amazon S3 資料表
Amazon S3 資料表是資料表儲存貯體的子資源。資料表會以 Apache Iceberg 格式存放,因此您可以使用查詢引擎和其他支援 的應用程式來使用這些資料表Apache Iceberg。Amazon S3 會持續最佳化您的資料表,以協助降低儲存成本並改善分析查詢效能。
當您建立資料表時,Amazon S3 會自動產生資料表的倉儲位置。倉儲位置是獨一無二的 S3 位置,您可以在其中讀取和寫入與資料表相關聯的物件。下列範例顯示倉儲位置的格式:
s3://63a8e430-6e0b-46f5-k833abtwr6s8tmtsycedn8s4yc3xhuse1b--table-s3
資料表具有下列 Amazon Resource Name (ARN) 格式:
arn:aws:s3tables:
region
:owner-account-id
:bucket/bucket-name
/table/table-id
根據預設,您最多可以在資料表儲存貯體中建立 10,000 個資料表。若要請求提高資料表儲存貯體或資料表的配額,請聯絡 支援
您可以使用連接至資料表儲存貯體的 Amazon S3 主控台、Amazon S3 REST API、 AWS SDKs、 AWS Command Line Interface (AWS CLI) 或查詢引擎來建立資料表。
建立資料表時,您可以指定該資料表的加密設定,除非您使用 Athena 建立資料表。如果您未指定加密設定,則會使用資料表儲存貯體的預設設定來加密資料表。如需詳細資訊,請參閱指定資料表的加密。
建立資料表的先決條件
若要建立資料表,您必須先執行下列動作:
建立命名空間。 在您的資料表儲存貯體中。
請確定您具有
s3tables:CreateTable
和 的 AWS Identity and Access Management (IAM) 許可s3tables:PutTableData
。注意
如果您為資料表使用 SSE-KMS 加密,則需要 的許可
s3tables:PutTableEncryption
,以及所選 AWS KMS 金鑰的DescribeKey
許可。此外,您使用的 AWS KMS 金鑰需要授予 S3 Tables 執行自動資料表維護的許可。如需詳細資訊,請參閱S3 Tables SSE-KMS 加密的許可要求
如需有效資料表名稱的資訊,請參閱 資料表和命名空間的命名規則。
重要
建立資料表時,請務必在資料表名稱和資料表定義中使用所有小寫字母。例如,請確定您的資料欄名稱都是小寫。如果您的資料表名稱或資料表定義包含大寫字母,則 AWS Lake Formation 或 不支援資料表 AWS Glue Data Catalog。在這種情況下,即使您的資料表儲存貯體與 AWS 分析服務整合,Amazon Athena 等 AWS 分析服務也看不到您的資料表。
如果您的資料表定義包含大寫字母,您在 Athena 中執行SELECT
查詢時會收到下列錯誤訊息:「GENERIC_INTERNAL_ERROR:取得資料表請求失敗:com.amazonaws.services.glue.model.ValidationException:不支援的聯合資源 - 無效的資料表或資料欄名稱。」
下列程序使用 Amazon S3 主控台來建立具有 Amazon Athena 的資料表。如果您尚未在資料表儲存貯體中建立命名空間,您可以在此程序中執行此操作。在執行下列步驟之前,請確定您已將資料表儲存貯體與此區域中的 AWS 分析服務整合。如需詳細資訊,請參閱搭配使用 Amazon S3 Tables 與 AWS 分析服務。
注意
當您使用 Athena 建立資料表時,該資料表會從資料表儲存貯體繼承預設加密設定。如果您想要使用不同的加密類型,您需要使用其他方法建立資料表。
若要建立資料表
登入 AWS Management Console ,並在 https://https://console.aws.amazon.com/s3/
開啟 Amazon S3 主控台。 -
在左側導覽窗格中,選擇資料表儲存貯體。
-
在資料表儲存貯體頁面上,選擇要在其中建立資料表的儲存貯體。
-
在儲存貯體詳細資訊頁面上,選擇使用 Athena 建立資料表。
-
在使用 Athena 建立資料表對話方塊中,執行下列其中一項操作:
-
建立新的命名空間。選擇建立命名空間,然後在命名空間名稱欄位中輸入名稱。命名空間名稱必須是 1 到 255 個字元,且在資料表儲存貯體中是唯一的。有效字元為 a–z、0–9 和底線 (
_
)。命名空間名稱開頭不允許底線。 -
選擇 Create namespace (建立命名空間)。
-
指定現有的命名空間。選擇指定此資料表儲存貯體中的現有命名空間。然後選擇從現有命名空間中選擇或輸入現有命名空間名稱。如果您的儲存貯體中有超過 1,000 個命名空間,如果命名空間名稱未出現在清單中,則必須輸入命名空間名稱。
-
-
選擇使用 Athena 建立資料表。
-
Amazon Athena 主控台隨即開啟,並顯示 Athena 查詢編輯器。Catalog 欄位應該填入 s3tablescatalog/,後面接著資料表儲存貯體的名稱,例如 s3tablescatalog/
amzn-s3-demo-bucket
。資料庫欄位應填入您先前建立或選取的命名空間。注意
如果您在目錄和資料庫欄位中沒有看到這些值,請確定您已將資料表儲存貯體與此區域中的 AWS 分析服務整合。如需詳細資訊,請參閱搭配使用 Amazon S3 Tables 與 AWS 分析服務。
-
查詢編輯器會填入可用來建立資料表的範例查詢。修改查詢以指定您希望資料表擁有的資料表名稱和資料欄。
-
當您完成修改查詢時,請選擇執行以建立資料表。
注意
-
如果您收到錯誤
「執行查詢的許可不足。當您嘗試在 Athena 中執行查詢時,委託人對指定資源沒有任何權限,
您必須獲得資料表上必要的 Lake Formation 許可。如需詳細資訊,請參閱授予資料表或資料庫的許可。 -
如果您在嘗試在 Athena 中執行查詢時收到錯誤
「Iceberg 無法存取請求的資源」
,請前往 AWS Lake Formation 主控台,並確定您已授予自己所建立資料表儲存貯體目錄和資料庫 (命名空間) 的許可。授予這些許可時,請勿指定資料表。如需詳細資訊,請參閱授予資料表或資料庫的許可。 -
如果您在 Athena 中執行
SELECT
查詢時收到下列錯誤訊息,此訊息是因為資料表名稱中有大寫字母,或資料表定義中有欄名稱:「GENERIC_INTERNAL_ERROR:取得資料表請求失敗:com.amazonaws.services.glue.model.ValidationException:不支援的聯合資源 - 無效的資料表或欄名稱。」
請確定您的資料表和資料欄名稱都是小寫。
-
如果您的資料表建立成功,新資料表的名稱會出現在 Athena 中的資料表清單中。當您導覽回 Amazon S3 主控台時,新資料表會在重新整理清單後出現在資料表儲存貯體的儲存貯體詳細資訊頁面上的資料表清單中。
此範例說明如何使用 建立具有結構描述的資料表, AWS CLI 並透過 指定資料表中繼資料JSON。若要使用此範例,請以您自己的資訊取代
。user
input placeholders
aws s3tables create-table --cli-input-json file://
mytabledefinition.json
對於 mytabledefinition.json
檔案,請使用下列範例資料表定義。若要使用此範例,請以您自己的資訊取代
。user input
placeholders
{ "tableBucketARN": "arn:aws:s3tables:
us-east-1
:111122223333
:bucket/amzn-s3-demo-table-bucket
", "namespace": "your_namespace
", "name": "example_table
", "format": "ICEBERG", "metadata": { "iceberg": { "schema": { "fields": [ {"name": "id
", "type": "int
","required": true
}, {"name": "name
", "type": "string
"}, {"name": "value
", "type": "int
"} ] } } } }
您可以在連接到資料表儲存貯體的支援查詢引擎中建立資料表,例如在 Amazon EMR 的 Apache Spark工作階段中。
下列範例說明如何使用 CREATE
陳述式Spark建立 資料表,並使用 INSERT
陳述式或從現有檔案讀取資料來新增資料表資料。若要使用此範例,請以您自己的資訊取代
。user input
placeholders
spark.sql( " CREATE TABLE IF NOT EXISTS s3tablesbucket.
example_namespace
.`example_table
` ( id INT, name STRING, value INT ) USING iceberg " )
建立資料表之後,您可以將資料載入資料表。請選擇下列其中一種方法:
使用
INSERT
陳述式將資料新增至資料表。spark.sql( """ INSERT INTO s3tablesbucket.
my_namespace
.my_table
VALUES (1, 'ABC', 100), (2, 'XYZ', 200) """)載入現有的資料檔案。
將資料讀取到 Spark:
val data_file_location = "
Path such as S3 URI to data file
" val data_file = spark.read.parquet(data_file_location
)將資料寫入 Iceberg 資料表:
data_file.writeTo("s3tablesbucket.
my_namespace
.my_table
").using("Iceberg").tableProperty ("format-version", "2").createOrReplace()