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 個のテーブルを作成できます。テーブルバケットまたはテーブルのクォータ引き上げをリクエストするには、サポート
テーブルは、Amazon S3 コンソール、Amazon S3 REST API、AWS SDK、AWS Command Line Interface (AWS CLI)、または統合クエリエンジンを使用して作成できます。
有効なテーブル名については、「テーブルと名前空間の命名規則」を参照してください。
テーブルを作成するための前提条件
テーブルを作成するには、まず以下の手順を実行する必要があります。
テーブルバケット内で 名前空間を作成します。。
s3tables:CreateTable
およびs3tables:PutTableData
に対する AWS Identity and Access Management (IAM) アクセス許可があることを確認してください。
重要
テーブルを作成するときは、テーブル名とテーブル定義にすべて小文字を使用してください。例えば、列名がすべて小文字であることを確認します。テーブル名またはテーブル定義に大文字が含まれている場合、テーブルは 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."
以下の手順では、Amazon S3 コンソールを使用して Amazon Athena でテーブルを作成します。テーブルバケット内に名前空間をまだ作成していない場合は、このプロセスの間に作成できます。
注記
以下の手順を実行する前に、このリージョンでテーブルバケットを AWS 分析サービスと統合していることを確認してください。詳細については、「AWS 分析サービスで Amazon S3 Tables を使用する」を参照してください。
テーブルを作成するには
AWS Management Console にサインインし、Amazon S3 コンソール https://console.aws.amazon.com/s3/
を開きます。 -
左側のナビゲーションペインで、[テーブルバケット] を選択します。
-
[テーブルバケット] ページで、テーブルを作成するバケットを選択します。
-
バケットの詳細ページで、[Athena でテーブルを作成] を選択します。
-
[Athena でテーブルを作成] ダイアログボックスで、次のいずれかを行います。
-
新しい名前空間を作成します。[名前空間を作成] を選択し、[名前空間名] フィールドに名前を入力します。名前空間名は 1~255 文字で、テーブルバケット内で一意であることが必要です。有効な文字は a〜z、0〜9、アンダースコア (
_
) です。名前空間名の先頭にアンダースコアを使用することはできません。 -
[名前空間の作成] を選択します。
-
既存の名前空間を指定します。[このテーブルバケット内の既存の名前空間を指定] を選択します。次に、[既存の名前空間から選択] または [既存の名前空間名を入力] のいずれかを選択します。バケット内に 1,000 個を超える名前空間がある場合、リストに表示されない名前空間名は手動で入力する必要があります。
-
-
[Athena でテーブルを作成] を選択します。
-
Amazon Athena コンソールが開き、Athena クエリエディタが表示されます。[カタログ] フィールドには、s3tablescatalog/ の後にテーブルバケットの名前が入力されます (s3tablescatalog/
amzn-s3-demo-bucket
など)。[データベース] フィールドには、以前に作成または選択した名前空間が入力されます。注記
[カタログ] および [データベース] フィールドにこれらの値が表示されない場合は、このリージョンでテーブルバケットを AWS 分析サービスと統合していることを確認してください。詳細については、「AWS 分析サービスで Amazon S3 Tables を使用する」を参照してください。
-
クエリエディタには、テーブルの作成に使用できるサンプルクエリが入力されます。クエリを変更して、テーブル名とテーブルに必要な列を指定します。
-
クエリの変更が完了したら、[実行] を選択してテーブルを作成します。
注記
-
クエリを実行するためのアクセス許可が不足しているという内容のエラーが表示された場合。Athena でクエリを実行しようとしたときに、プリンシパルは指定されたリソースに対する権限を持っていない
という内容のエラーが表示される場合は、テーブルに対する必要な Lake Formation 許可が付与されている必要があります。詳細については、「テーブルまたはデータベースに対するアクセス許可の付与」を参照してください。 -
Athena でクエリを実行しようとしたときに、
Iceberg はリクエストされたリソースにアクセスできない
という内容のエラーが表示される場合は、AWS Lake Formation コンソールに移動し、作成したテーブルバケットカタログとデータベース (名前空間) に対するアクセス許可が自分に付与されていることを確認してください。これらのアクセス許可を付与するときは、テーブルを指定しないでください。詳細については、「テーブルまたはデータベースに対するアクセス許可の付与」を参照してください。 -
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 を使用して 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()