[新機能] Amazon Redshift が Apache Iceberg テーブルへの書き込み(append-only)をサポートしたので試してみました

[新機能] Amazon Redshift が Apache Iceberg テーブルへの書き込み(append-only)をサポートしたので試してみました

2025.11.18

クラウド事業本部の石川です。Amazon Redshift が Apache Iceberg テーブルへの書き込み機能をサポートしました。本日よりRedshiftユーザーはApache Icebergテーブルに対して、読み取りだけでなく書き込みクエリも実行できるようになり、append-only(追記型)ワークロードに対応した分析が可能になります。

https://aws.amazon.com/jp/about-aws/whats-new/2025/11/aws-redshift-iceberg-writes-m1/

Apache Iceberg とは

Apache Icebergは、オープンなテーブルフォーマットとして、データレイクに保存された大規模で進化し続けるテーブルのデータ処理を簡素化するために、多くの企業で採用されています。トランザクション整合性、レコードレベルの更新、スキーマやパーティションのシームレスな進化など、現代のデータレイク活用に必要な高度な機能を提供し、最も注目されるオープンテーブルフォーマット(OTF)です。

https://dev.classmethod.jp/articles/20251108-data-sapporo-data-and-ai-lakehouse/

サポートされた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を使用を検討してください。

この記事をシェアする

FacebookHatena blogX

関連記事