

# 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 リソースネーム (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 SDK、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` および `s3tables:PutTableData` に対する AWS Identity and Access Management (IAM) アクセス許可があることを確認してください。
+ 
**注記**  
テーブルで 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 マネジメントコンソール にサインインし、Amazon S3 コンソール [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) を開きます。

1. 左側のナビゲーションペインで、**[テーブルバケット]** を選択します。

1. **[テーブルバケット]** ページで、テーブルを作成するバケットを選択します。

1. バケットの詳細ページで、**[Athena でテーブルを作成]** を選択します。

1. **[Athena でテーブルを作成]** ダイアログボックスで、次のいずれかを行います。
   + 新しい名前空間を作成します。**[名前空間を作成]** を選択し、**[名前空間名]** フィールドに名前を入力します。名前空間名は 1～255 文字で、テーブルバケット内で一意であることが必要です。有効な文字は a〜z、0〜9、アンダースコア (`_`) です。名前空間名の先頭にアンダースコアを使用することはできません。
   + [**名前空間の作成**] を選択します。
   + 既存の名前空間を指定します。**[このテーブルバケット内の既存の名前空間を指定]** を選択します。次に、**[既存の名前空間から選択]** または **[既存の名前空間名を入力]** のいずれかを選択します。バケット内に 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()
     ```