[新機能] Amazon Redshift が Apache Iceberg テーブルへの書き込み(append-only)をサポートしたので試してみました
クラウド事業本部の石川です。Amazon Redshift が Apache Iceberg テーブルへの書き込み機能をサポートしました。本日よりRedshiftユーザーはApache Icebergテーブルに対して、読み取りだけでなく書き込みクエリも実行できるようになり、append-only(追記型)ワークロードに対応した分析が可能になります。
Apache Iceberg とは
Apache Icebergは、オープンなテーブルフォーマットとして、データレイクに保存された大規模で進化し続けるテーブルのデータ処理を簡素化するために、多くの企業で採用されています。トランザクション整合性、レコードレベルの更新、スキーマやパーティションのシームレスな進化など、現代のデータレイク活用に必要な高度な機能を提供し、最も注目されるオープンテーブルフォーマット(OTF)です。
サポートされたSQL
今回のアップデートにより、Amazon Redshiftは以下のSQL操作をサポートされました。
DDL(データ定義言語)操作
CREATE- Apache Icebergテーブルの作成SHOW- テーブル定義SQLの表示DROP- テーブルの削除
DML(データ操作言語)操作
INSERT- データの挿入
Apache Iceberg テーブルへの書き込みを試す
今回は、 Iceberg テーブルの作成、レコード追加、テーブル削除まで一連の流れを検証し、Icebergのファイルがどのような状態であるかを確認するため、汎用S3バケットにIcebergテーブルを作成しました。
検証環境
- リージョン: バージニア(us-east-1)
- Redshiftの種類: Amazon Redshift Servreless(8RPU)
- Redshiftのバージョン: 1.0.160706
- Icebergテーブル: 汎用S3バケットにIcebergテーブルを作成
devio=# SELECT version();
version
----------------------------------------------------------
PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.160706
(1 row)
外部スキーマの作成
Icebergテーブルは外部スキーマの中に作成するため、外部スキーマを事前に作成します。
devio=# -- External Schemaの作成
devio=# CREATE EXTERNAL SCHEMA IF NOT EXISTS lakehouse_s3_schema
devio-# FROM DATA CATALOG
devio-# DATABASE 'lakehouse_s3_db'
devio-# IAM_ROLE 'arn:aws:iam::123456789012:role/AmazonRedshiftSpectrumRole'
devio-# REGION 'us-east-1'
devio-# CREATE EXTERNAL DATABASE IF NOT EXISTS;
INFO: External database "lakehouse_s3_db" created
CREATE SCHEMA
devio=# -- External Schemaの確認
devio=# SELECT * FROM svv_external_schemas;
esoid | eskind | schemaname | esowner | databasename | esoptions
--------+--------+---------------------+---------+-----------------+-------------------------------------------------
557985 | 1 | lakehouse_s3_schema | 100 | lakehouse_s3_db | {"IAM_ROLE":"arn:aws:iam::123456789012:role/AmazonRedshiftSpectrumRole","REGION":"us-east-1"}
(1 rows)
指定したIAM_ROLEは、AmazonAthenaFullAccessとAmazonS3FullAccessを付与していますが、必要に応じて権限やアクセスするリソースは制限してください。また、IAM_ROLEは、Redshiftに事前にアタッチしておく必要があります。
Icebergテーブルの作成
Icebergテーブルが、USING句にICEBERGを指定して作成します。
devio=# -- 日付パーティション付きテーブル
devio=# -- DROP TABLE lakehouse_s3_schema.sales_partitioned
devio=# CREATE TABLE lakehouse_s3_schema.sales_partitioned
devio-# (
devio(# sale_id BIGINT,
devio(# product_id VARCHAR,
devio(# product_name VARCHAR,
devio(# category VARCHAR,
devio(# quantity INT,
devio(# price DECIMAL(10,2),
devio(# sale_timestamp TIMESTAMP
devio(# )
devio-# USING ICEBERG
devio-# LOCATION 's3://cm-lakehouse-20251118/lakehouse_s3_schema/sales_partitioned/'
devio-# PARTITIONED BY (day(sale_timestamp))
devio-# TABLE PROPERTIES ('compression_type'='snappy');
CREATE TABLE
devio=# \x
Expanded display is on.
devio=# -- テーブル一覧の表示
devio=# SELECT * FROM svv_external_tables
devio-# WHERE schemaname = 'lakehouse_s3_schema';
-[ RECORD 1 ]----------+---------------------------------------------------------------------------------------------------------------------------------
redshift_database_name |
schemaname | lakehouse_s3_schema
tablename | sales_partitioned
location | s3://cm-lakehouse-20251118/lakehouse_s3_schema/sales_partitioned
input_format |
output_format |
serialization_lib |
serde_parameters | {}
compressed | 0
parameters | {"format":"ICEBERG","metadata_location":"s3://cm-lakehouse-20251118/lakehouse_s3_schema/sales_partitioned/metadata/00000-cd9b8776-39e0
tabletype |
devio=# -- テーブル定義の表示
devio=# SHOW TABLE lakehouse_s3_schema.sales_partitioned;
-[ RECORD 1 ]------------+----------------------------------------------------------------------
Show Table DDL statement | CREATE TABLE lakehouse_s3_schema.sales_partitioned (sale_id bigint, +
| product_id varchar, +
| product_name varchar, +
| category varchar, +
| quantity int, +
| price decimal(10, 2), +
| sale_timestamp timestamp) +
| USING ICEBERG +
| LOCATION 's3://cm-lakehouse-20251118/lakehouse_s3_schema/sales_partitioned'+
| PARTITIONED BY (DAY(sale_timestamp)) +
| TABLE PROPERTIES ('compression_type'='snappy');
レコードの追加
一度に5レコードを追加、sale_timestamp を異なる日付(11/15, 11/16, 11/17)に分散させ、日単位のパーティショニングが有効に機能するようにしています。
devio=# INSERT INTO lakehouse_s3_schema.sales_partitioned
devio-# (sale_id, product_id, product_name, category, quantity, price, sale_timestamp)
devio-# VALUES
devio-# (1, 'P001', 'ノートパソコン ThinkPad X1', 'Electronics', 2, 125000.00, TIMESTAMP '2024-11-15 10:30:00'),
devio-# (2, 'P002', 'iPhone 15 Pro', 'Electronics', 1, 159800.00, TIMESTAMP '2024-11-15 14:20:00'),
devio-# (3, 'P003', 'ワイヤレスヘッドフォン WH-1000XM5', 'Audio', 3, 45000.00, TIMESTAMP '2024-11-16 09:15:00'),
devio-# (4, 'P004', 'iPad Pro 12.9インチ', 'Electronics', 1, 178800.00, TIMESTAMP '2024-11-16 16:45:00'),
devio-# (5, 'P005', 'メカニカルキーボード HHKB', 'Accessories', 2, 35000.00, TIMESTAMP '2024-11-17 11:00:00');
INSERT 0 5
devio=# select * from lakehouse_s3_schema.sales_partitioned;
-[ RECORD 1 ]--+----------------------------------
sale_id | 1
product_id | P001
product_name | ノートパソコン ThinkPad X1
category | Electronics
quantity | 2
price | 125000.00
sale_timestamp | 2024-11-15 10:30:00
-[ RECORD 2 ]--+----------------------------------
sale_id | 5
product_id | P005
product_name | メカニカルキーボード HHKB
category | Accessories
quantity | 2
price | 35000.00
sale_timestamp | 2024-11-17 11:00:00
-[ RECORD 3 ]--+----------------------------------
sale_id | 3
product_id | P003
product_name | ワイヤレスヘッドフォン WH-1000XM5
category | Audio
quantity | 3
price | 45000.00
sale_timestamp | 2024-11-16 09:15:00
-[ RECORD 4 ]--+----------------------------------
sale_id | 4
product_id | P004
product_name | iPad Pro 12.9インチ
category | Electronics
quantity | 1
price | 178800.00
sale_timestamp | 2024-11-16 16:45:00
-[ RECORD 5 ]--+----------------------------------
sale_id | 2
product_id | P002
product_name | iPhone 15 Pro
category | Electronics
quantity | 1
price | 159800.00
sale_timestamp | 2024-11-15 14:20:00
INSERT直後のS3の状態は、以下のとおりです。dataフォルダに日付のパーティションが作成され、その下にファイルが配置されています。
% aws s3 ls s3://cm-lakehouse-20251118/lakehouse_s3_schema/sales_partitioned/ --recursive
2025-11-18 13:43:32 1977 lakehouse_s3_schema/sales_partitioned/data/sale_timestamp=2024-11-15/57054f/20251118_324553_14e1f4ee-89bd-48a9-b52f-d11d37b5d6d5_64.parquet
2025-11-18 13:43:32 2117 lakehouse_s3_schema/sales_partitioned/data/sale_timestamp=2024-11-15/eab72b/20251118_324553_e13987ab-01db-4e56-aa4d-a39c72c76bcb_67.parquet
2025-11-18 13:43:32 2040 lakehouse_s3_schema/sales_partitioned/data/sale_timestamp=2024-11-16/22d79c/20251118_324553_81dbc9ba-a8bd-405f-a074-be4412df4ea8_66.parquet
2025-11-18 13:43:32 2152 lakehouse_s3_schema/sales_partitioned/data/sale_timestamp=2024-11-16/c141a3/20251118_324553_3deae418-ecdd-45de-a8f9-d791a5096a36_65.parquet
2025-11-18 13:43:33 2129 lakehouse_s3_schema/sales_partitioned/data/sale_timestamp=2024-11-17/eab72b/20251118_324553_d4397651-fc15-4fc6-944c-7481330e6e0c_67.parquet
2025-11-18 13:34:59 1187 lakehouse_s3_schema/sales_partitioned/metadata/00000-cd9b8776-39e0-4b4a-897c-88368fc8fce6.metadata.json
2025-11-18 13:43:34 1977 lakehouse_s3_schema/sales_partitioned/metadata/00001-207df89b-3ded-40fb-9801-228ed27e6029.metadata.json
2025-11-18 13:43:33 3487 lakehouse_s3_schema/sales_partitioned/metadata/20251118_324553_1825e94e-e090-4336-81f9-f4e94de26a67_64.manifest.avro
2025-11-18 13:43:33 3909 lakehouse_s3_schema/sales_partitioned/metadata/20251118_324553_825c3a8e-5ae3-48c6-9760-3962ba320d95_67.manifest.avro
2025-11-18 13:43:33 3505 lakehouse_s3_schema/sales_partitioned/metadata/20251118_324553_88abd2a4-561c-4439-a719-6773e5785861_66.manifest.avro
2025-11-18 13:43:33 3537 lakehouse_s3_schema/sales_partitioned/metadata/20251118_324553_dac993cb-67ac-4d96-aa71-4b3edd5a166b_65.manifest.avro
2025-11-18 13:43:33 2633 lakehouse_s3_schema/sales_partitioned/metadata/snap-7075147324774047667-1-f8c57ef0-0802-4c2f-a703-6bcf11b7e194.avro
レコードの削除(✗)
ダメ元でレコードの削除を試してみましたが、Operation is not supported on this tableとなりました。
devio=# DELETE FROM lakehouse_s3_schema.sales_partitioned WHERE sale_id=1;
ERROR: Operation is not supported on this table.
テーブルの削除
テーブルを削除しました。
devio=# DROP TABLE lakehouse_s3_schema.sales_partitioned;
DROP TABLE
しかし、メタデータのみ削除であり、S3のオブジェクトが削除されないため、同じテーブル名のIcebergテーブルを再作成するとエラーになります。現状は、Icebergテーブル削除した後、S3のオブジェクトを手動で消さないとならないようです。
ユースケース
この新機能は、以下のようなシナリオで特に有効です。
-
データレイクへのリアルタイム追記
- Redshiftでの分析結果をIcebergテーブルに直接書き込み、他のツールと共有
-
マルチエンジン分析環境
- Redshift、Spark、Presto など複数のエンジンで同じIcebergテーブルを利用
-
データウェアハウスとデータレイクの統合
- データウェアハウスの高速クエリ性能と、データレイクの柔軟性を同時に実現
最後に
Amazon RedshiftによるApache Icebergテーブルへの書き込みサポート(append-only)により、他のユーザーやアプリケーションがテーブルに対してDML操作を実行している間も、数万の顧客が利用するエンタープライズグレードのクラウドデータウェアハウスの性能とスケーラビリティを活用して、安全に書き込み操作を実行できるようになります。ALTER TABLEに関しては、今後リリースを予定しているそうです。UPDATE、MERGE、DELETEなど、他のDMLのサポートはAthena/EMR/Glueを使用を検討してください。







