特定のポリシーに基づいてすべてのデータファイルをマージします。 これにより、クエリの効率が向上します。
説明
デルタテーブルは、ほぼリアルタイムの増分データ書き込みとタイムトラベルクエリをサポートします。 データが頻繁に書き込まれると、多数の小さなファイルが生成される。 小さなファイルをマージして重複排除するには、効率的なコンパクションポリシーが必要です。 コンパクションポリシーは、多数の小さなファイルによって引き起こされる低I/Oスループットの問題を解決し、ストレージシステムへの負荷を軽減する必要があります。 コンパクションポリシーは、頻繁なコンパクションシナリオでの重大な書き込み増幅と競合による障害も防ぐ必要があります。
次のデータマージ方法がサポートされています。
クラスタリング: デルタファイルのみが大きなファイルにマージされ、データコンテンツは変更されません。 デルタファイルには、コミットされた操作に関係するデータが含まれます。 システムは、新しいファイルのサイズや数などの要因に基づいて、クラスタリング操作を定期的に実行します。 手動操作は要求されない。 この方法は、小さなファイルのI/Oスループットと安定性を向上させるのに役立ちます。
Compaction: すべてのデータファイルは、特定のポリシーに基づいてマージされ、基本ファイルのバッチが生成されます。 同じ主キーを持つデータ行には、最新のステータスのみが保存されます。 履歴ステータスまたはシステム列情報は保存されません。 これにより、クエリの効率が向上します。
構文
alter table <table_name> [partition
(<partition_key> = '<partition_value>' [, ...])
]
compact major;注意事項
手動でコンパクションをトリガーする場合は、次の設定を構成する必要があります。
set odps.merge.task.mode=service;コンパクション操作はクエリ効率を向上させますが、コンパクション中に新しいファイルが生成されるため、データファイルのストレージコストが増加します。 ビジネス要件に基づいてトリガー頻度を設定できます。
コンパクション操作は、データの読み取りおよび書き換えのためにコンピューティングリソースを消費する。 従量課金の課金方法を使用する場合、次の式に基づいてコンパクション操作に対して課金されます。スキャンされたデータ量 × 1 × 単価
. サブスクリプション課金方法を使用する場合、コンパクション操作では、サブスクリプションコンピューティングリソースのクォータが使用されます。
例:
-- Create a table.
create table mf_dt (pk bigint not null primary key, val bigint not null)
partitioned by (dd string, hh string)
tblproperties ("transactional"="true");
-- Insert data into the table.
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);
-- Perform the compaction operation. After the compaction operation is complete, you can continue to query historical data.
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';
select * from mf_dt timestamp as of get_latest_timestamp('mf_dt', 2) where dd='01' and hh='01';