

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 建立 Amazon S3 資料表
<a name="s3-tables-create"></a>

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 個資料表。若要請求提高資料表儲存貯體或資料表的配額，請聯絡 [支援](https://console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase)。

您可以使用連接至資料表儲存貯體的 Amazon S3 主控台、Amazon S3 REST API、 AWS SDKs、 AWS Command Line Interface (AWS CLI) 或查詢引擎來建立資料表。

建立資料表時，您可以指定該資料表的加密設定，除非是使用 Athena 建立資料表。如果未指定加密設定，則您會使用資料表儲存貯體的預設設定來加密資料表。如需詳細資訊，請參閱[指定資料表加密](s3-tables-kms-specify.md#specify-kms-table)。

**建立資料表的先決條件**

若要建立資料表，您必須先執行下列動作：
+ [建立資料表儲存貯體](s3-tables-buckets-create.md).
+ 資料表儲存貯體中的 [建立命名空間。](s3-tables-namespace-create.md)。
+ 請確定您具有 `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 加密的許可要求](s3-tables-kms-permissions.md)

如需有效資料表名稱的相關資訊，請參閱 [資料表和命名空間的命名規則](s3-tables-buckets-naming.md#naming-rules-table)。

**重要**  
建立資料表時，請務必在資料表名稱和資料表定義中，全部都使用小寫字母。例如，確定欄的名稱都小寫。如果您的資料表名稱或資料表定義包含大寫字母，則 AWS Lake Formation 或 不支援資料表 AWS Glue Data Catalog。在這種情況下，即使您的資料表儲存貯體與 AWS 分析服務整合，Amazon Athena 等 AWS 分析服務也看不到您的資料表。  
如果您的資料表定義包含大寫字母，您在 Athena 中執行 `SELECT` 查詢時會收到下列錯誤訊息："GENERIC\_INTERNAL\_ERROR: Get table request failed: com.amazonaws.services.glue.model.ValidationException: Unsupported Federation Resource - Invalid table or column names."

## 使用 S3 主控台和 Amazon Athena
<a name="create-table-console"></a>

下列程序會使用 Amazon S3 主控台建立具有 Amazon Athena 的資料表。如果您尚未在資料表儲存貯體中建立命名空間，您可以在此程序中執行此操作。在執行下列步驟之前，請確定您已將資料表儲存貯體與此區域中的 AWS 分析服務整合在一起。如需詳細資訊，請參閱[將 Amazon S3 Tables 與 AWS 分析服務整合](s3-tables-integrating-aws.md)。

**注意**  
當您使用 Athena 建立資料表時，該資料表會從資料表儲存貯體繼承預設加密設定。如果您想要使用不同的加密類型，您需要使用其他方法建立資料表。

**若要建立資料表**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇**資料表儲存貯體**。

1. 在**資料表儲存貯體**頁面上，選擇要建立資料表的儲存貯體。

1. 在儲存貯體詳細資訊頁面上，選擇**使用 Athena 建立資料表**。

1. 在**使用 Athena 建立資料表**對話方塊中，執行下列其中一項操作：
   + 建立新命名空間。選擇**建立命名空間**，然後在**命名空間名稱**欄位中輸入名稱。命名空間名稱必須具有 1 到 255 個字元，而且在資料表儲存貯體中是唯一的。有效字元為 a-z、0-9 和 \_ (`_`)。命名空間名稱開頭不得為底線。
   + 選擇 **Create namespace (建立命名空間)**。
   + 指定現有的命名空間。選擇**指定此資料表儲存貯體中的現有命名空間**。然後選擇**從現有命名空間中選擇**或**輸入現有命名空間名稱**。如果您的儲存貯體中有超過 1,000 個命名空間，而當命名空間名稱未出現在清單中時，您必須輸入命名空間名稱。

1. 選擇**使用 Athena 建立資料表**。

1. Amazon Athena 主控台隨即開啟，並顯示 Athena 查詢編輯器。**目錄**欄位應填入 **s3tablescatalog/**，後面接資料表儲存貯體的名稱，例如 **s3tablescatalog/{{amzn-s3-demo-bucket}}**。**資料庫**欄位應填入您先前建立或選取的命名空間。
**注意**  
如果在**目錄**和**資料庫**欄位中沒有看到這些值，請確定您已將資料表儲存貯體與此區域中的 AWS 分析服務整合在一起。如需詳細資訊，請參閱[將 Amazon S3 Tables 與 AWS 分析服務整合](s3-tables-integrating-aws.md)。

1. 查詢編輯器會填入可用來建立資料表的查詢範例。修改查詢以指定您希望資料表擁有的資料表名稱和欄位。

1. 修改完查詢後，請選擇**執行**以建立資料表。
**注意**  
如果您嘗試在 Athena 中執行查詢時收到錯誤訊息：「執行查詢的權限不足。主體對指定資源沒有任何權限」，您必須獲得資料表上必要的 Lake Formation 許可權。如需詳細資訊，請參閱[授予資料表或資料庫的 Lake Formation 許可](grant-permissions-tables.md#grant-lf-table)。
如果您在嘗試在 Athena 中執行查詢時收到錯誤「Iceberg 無法存取請求的資源」，請前往 AWS Lake Formation 主控台，並確定您已授予自己所建立資料表儲存貯體目錄和資料庫 （命名空間） 的許可。授予這些許可權時，請勿指定資料表。如需詳細資訊，請參閱[授予資料表或資料庫的 Lake Formation 許可](grant-permissions-tables.md#grant-lf-table)。
如果您在 Athena 中執行 `SELECT` 查詢時收到下列錯誤訊息，而此訊息的肇因來自資料表名稱中有大寫字母，或資料表定義中有欄名稱："GENERIC\_INTERNAL\_ERROR: Get table request failed: com.amazonaws.services.glue.model.ValidationException: Unsupported Federation Resource - Invalid table or column names." 請確定您的資料表和欄名稱都是小寫。

如果您的資料表建立成功，新資料表的名稱會出現在 Athena 中的資料表清單中。當您導覽回到 Amazon S3 主控台時，新資料表會在重新整理清單後，出現在資料表的儲存貯體詳細資訊頁面上的**資料表**清單中。

## 使用 AWS CLI
<a name="create-table-CLI"></a>

此範例示範如何使用 建立具有結構描述的資料表， 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}}"}
                ]
            }
        }
    }
}
```

## 使用查詢引擎
<a name="create-table-engine"></a>

您可以在連接到資料表儲存貯體的支援查詢引擎中建立資料表，例如在 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)
  """)
  ```
+ 載入現有的資料檔案。

  1. 將資料讀取至 Spark：

     ```
     val data_file_location = "{{Path such as S3 URI to data file}}"
     val data_file = spark.read.parquet({{data_file_location}})
     ```

  1. 將資料寫入 Iceberg 資料表：

     ```
     data_file.writeTo("s3tablesbucket.{{my_namespace}}.{{my_table}}").using("Iceberg").tableProperty ("format-version", "2").createOrReplace()
     ```