Delta テーブルへの頻繁な書き込みにより、多数の小規模ファイルが生成され、I/O スループットが低下し、ストレージ負荷が増加します。コンパクションは、すべてのデータファイルを統合されたベースファイル群にマージし、各行の最新バージョンのみを保持することで、クエリ実行時にスキャン対象となるファイル数を削減し、処理速度を向上させます。
概要
Delta テーブルでは、以下の 2 種類のデータ統合手法をサポートしています。
| 手法 | 機能 | トリガー |
|---|---|---|
| クラスタリング | データ内容を変更せずに、デルタファイルのみをより大規模なファイルにマージします。デルタファイルには、コミット済み操作のデータが格納されます。 | 自動 — システムが、ファイルサイズおよびファイル数に基づいて定期的にクラスタリングを実行します。手動による操作は不要です。 |
| コンパクション | すべてのデータファイルを一括してベースファイル群にマージします。同一のプライマリキーを持つ行については、最新の行のみを保持し、履歴行バージョンおよびシステム列データは保持されません。 | 手動 — ALTER TABLE ... COMPACT MAJOR を実行します。 |
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
-
Delta テーブル(
tblproperties ("transactional"="true")を指定して作成) -
セッションプロパティ
odps.merge.task.mode=serviceがセッション内で設定済みであること
構文
ALTER TABLE <table_name>
[PARTITION (<partition_key> = '<partition_value>' [, ...])]
COMPACT MAJOR;
パラメーター
| パラメーター | 必須 | 説明 |
|---|---|---|
table_name |
はい | コンパクション対象の Delta テーブル名。 |
partition_key |
いいえ | パーティションキー名。単一パーティションを対象にコンパクションを実行する場合に指定します。 |
partition_value |
いいえ | パーティションキーの値。 |
注意事項
-
必須のセッションプロパティ: コンパクションを実行する前に、
odps.merge.task.mode=serviceを設定してください。SET odps.merge.task.mode=service; -
ストレージコスト: コンパクションは、古いファイルを削除する前に新しいベースファイルを生成するため、一時的にストレージ使用量が増加します。ビジネス要件に応じて、トリガー頻度を設定できます。
-
書き込み増幅および競合: コンパクションポリシーは、頻繁なコンパクション実行時における重大な書き込み増幅および競合による障害を防止するよう設計されています。
課金
| 課金方法 | コンパクションの課金方式 |
|---|---|
| 従量課金 | スキャン対象データ量 × 1 × 単位価格 |
| サブスクリプション | サブスクリプションのコンピューティングクォータから差し引かれます。 |
例
以下の例では、パーティション付き Delta テーブルを作成し、3 回のバッチでデータを挿入した後、コンパクションを実行し、タイムトラベル機能を用いて履歴データをクエリします。
-- プライマリキーおよび 2 つのパーティション列を含む Delta テーブルを作成します。
CREATE TABLE mf_dt (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT NOT NULL)
PARTITIONED BY (dd STRING, hh STRING)
TBLPROPERTIES ("transactional"="true");
-- 増分書き込みを模擬するために、3 回のバッチでデータを挿入します。
INSERT INTO TABLE mf_dt PARTITION(dd='01', hh='01') VALUES (1, 1), (2, 2);
INSERT INTO TABLE mf_dt PARTITION(dd='01', hh='01') VALUES (2, 20), (3, 3);
INSERT INTO TABLE mf_dt PARTITION(dd='01', hh='01') VALUES (3, 30), (4, 4);
-- パーティションに対してコンパクションを実行します。
SET odps.merge.task.mode=service;
ALTER TABLE mf_dt PARTITION(dd='01', hh='01') COMPACT MAJOR;
-- コンパクション後の最新スナップショットをクエリします。
SELECT * FROM mf_dt TIMESTAMP AS OF get_latest_timestamp('mf_dt')
WHERE dd='01' AND hh='01';
-- 最新スナップショットの 1 つ前のスナップショット(タイムトラベルはコンパクション後も有効)をクエリします。
SELECT * FROM mf_dt TIMESTAMP AS OF get_latest_timestamp('mf_dt', 2)
WHERE dd='01' AND hh='01';