Delta Table は、MaxCompute 内で大規模な分析用データセット向けに設計された高性能テーブルフォーマットです。プライマリキーを持たないテーブル向けの Append Delta Table と、プライマリキーを持つテーブル向けの PK Delta Table の 2 種類があります。本トピックでは、Delta Table の基本的な特徴と操作について説明します。
概要
Delta Table は、Alibaba Cloud MaxCompute 内の高性能テーブルフォーマットです。原子性、一貫性、独立性、永続性 (ACID) トランザクション、増分クエリ、タイムトラベル、動的クラスターバケット化、リアルタイムデータ更新、スキーマ進化などの機能をサポートします。MaxCompute のネイティブなデータレイクハウスおよびニアリアルタイムコンピューティング機能により、標準 SQL を使用して Delta Table を作成・更新・クエリできます。複雑な基盤ストレージやメタデータを管理する必要はなく、MaxCompute が自動的にこれらを維持・最適化し、使いやすさとコスト効率のバランスを実現します。
特徴
|
カテゴリ |
機能 |
Append Delta Table |
PK Delta Table |
|
基本 DML |
Insert、Update、Delete、Merge Into。 |
サポート |
サポート |
|
ACID トランザクション |
リードコミッティド / スナップショット分離。 詳細については、「ACID トランザクション管理」をご参照ください。 |
サポート |
サポート |
|
プライマリキー |
プライマリキーを定義します。 |
未サポート |
部分列更新をサポート |
|
スキーマ進化 |
列の追加、削除、名前の変更、順序の変更、データ型の変更をサポートします。 詳細については、「ALTER TABLE」をご参照ください。 |
サポート |
サポート |
|
データインポート |
|
ストリーム / バッチアップロード ストリームアップロード後、データは即座に参照可能になります。 |
アップサート |
|
タイムトラベル |
時刻またはバージョン番号を指定して過去のスナップショットをクエリし、結果を再現または監査分析を実行できます。 詳細については、「タイムトラベル」をご参照ください。 |
サポート |
サポート |
|
増分コンピューティング |
Delta Live マテリアライズドビュー (MV) および増分読み取り。 詳細については、「増分コンピューティング」および「増分クエリ」をご参照ください。 |
サポート (増分マテリアライズドビューは現在対応中です。) |
サポート |
|
データ構成の最適化 |
小ファイルのマージ、マルチレベルの COMPACTION、データソートなどの最適化を含む、増分データファイルを自動的に維持し、データストレージおよびコンピューティングを安定かつ効率的な状態に保ちます。 詳細については、「Append Delta Table のデータ構成最適化」および「PK Delta Table のデータ構成最適化」をご参照ください。 |
サポート バケット数を設定する必要はありません。動的バケット化がデータ分布に自動的に適応します。 |
サポート |
|
クエリパフォーマンスの最適化 |
パーティションレベルおよびファイルレベルの統計情報 (Min/Max など)、パーティションプルーニング、列のプルーニング、述語プッシュダウン。 |
サポート |
サポート |
|
セキュリティとコンプライアンス |
サポート |
サポート |
|
|
ディザスタリカバリとバックアップ |
サポート |
サポート |
|
|
コスト |
AliORC 列指向ストレージ圧縮および階層型ストレージ。 |
サポート |
サポート |
ユーザーエクスペリエンス
リアルタイムサービス向けのリアルタイムデータ更新
Delta Table は、Stream Upload を通じてリアルタイムデータ書き込みおよび更新 (アップサート) をサポートします。書き込まれたデータは即座に参照可能になります。データ書き込みのリアルタイム性能とクエリ性能のバランスを取るため、MaxCompute は階層型ストレージおよび最適化戦略を採用しています。
-
リアルタイム書き込みを保証:新規データはまず、ソートせずに非クラスター化バケットに高速で書き込まれます。このプロセスにより、データ書き込みの遅延が低く、スループットが高くなります。
-
SQL クエリパフォーマンスを向上:バックグラウンドの増分再クラスタリングサービスが、増分データを非同期でソート済みのクラスター化バケットに再構成・最適化します。クエリ実行時には、クエリエンジンがソート済みベースデータに対して効率的にプルーニングを行い、少量の増分データのみをスキャンします。これにより、データの新鮮さとクエリ効率のバランスが実現されます。
効率的な増分データ処理と分析
基盤となる増分データの読み書き機能に基づき、MaxCompute はエンドツーエンドのデータ分析の適時性を向上させる豊富な高機能を提供します。増分コンピューティング や Delta Live マテリアライズドビュー (Delta Live MV) (招待制プレビュー) などの高度な機能を組み合わせることで、効率的なリアルタイムデータ処理パイプラインを構築し、ビジネスインサイトへのデータ変換を加速できます。
ビジネス成長への対応と従来のテーブルフォーマットの制限克服
-
動的バケット割り当て:Append Delta Table は動的バケット割り当てをサポートします。DDL 文でバケット数を指定する必要がなく、各パーティションの将来のデータ量を推定して適切なバケット数を決定する必要もありません。データ書き込み量が増えるにつれて、動的バケット化サービスが既存のバケットを分割または新規作成し、ビジネスデータ量の変化に動的に適応します。この機能により、バケットが大きすぎたり小さすぎたりすることによるデータスキューおよび断片化の問題を解決します。
-
スキーマ進化:Delta Table はスキーマ進化をサポートし、データフィールドの調整やデータ精度の向上といったビジネス要件の変化に対応します。この機能は列の追加、削除、変更、名前の変更をサポートし、完全な下位互換性を提供し、誤ったデータ削除や損失を防止します。
従来のテーブル制限の克服:単一の Delta Table は、INSERT INTO、UPDATE、DELETE、および MERGE INTO 操作とクラスター化・ソート済みストレージをサポートします。これにより、これらの機能を同時にサポートしない従来のパーティションテーブル、クラスター化テーブル、トランザクションテーブルの制限を解消します。
-
MaxCompute SQL、MaxFrame、Spark on MaxCompute など、複数のエンジンでのコンピューティングをサポートします。Flink、Spark、StarRocks などのオープンソースエンジンも、Spark Connector およびオープンストレージ API を通じて Delta Table にアクセスできます。
パフォーマンスと信頼性のバランス
-
Delta Table は、テラバイトからペタバイト規模の大容量データ管理に適しています。極めて大規模なデータ量であっても、メタデータ操作は高速です。クエリはパーティションプルーニング、列のプルーニング、述語プッシュダウンなどの機能をサポートし、不要なデータスキャンを回避します。
-
ACID トランザクション管理:Delta Table は楽観的同時実行制御を使用して、複数のライターからの同時操作をサポートします。書き込み競合は検出され、再試行されることでデータ整合性が保証されます。
-
セキュリティとコンプライアンス:Delta Table はデータセキュリティおよびコンプライアンス要件を満たします。ストレージ暗号化、テーブルレベルおよび列レベルのアクセス制御リスト (ACL)、行レベルの権限、動的データマスキングをサポートします。
-
バックアップとロールバック:ゴミ箱モードを採用したバージョン管理付きバックアップおよびロールバックメカニズムにより、データ破損や誤って削除が発生した場合でも、テーブルを直前の健全な状態に迅速にロールバックできます。これにより、運用管理 (O&M) リスクおよび管理リスクを軽減します。
SQL 操作
DDL
Append Delta Table の作成
-- Append Delta Table の作成
CREATE TABLE <table_name> (
<col_name> <data_type> [NOT NULL] [DEFAULT <default_value>] [comment <col_comment>], ...
)
[comment <table_comment>]
[RANGE CLUSTERED BY (<col_name> [, <col_name>, ...]) ]
TBLPROPERTIES (
"table.format.version"="2"
["acid.data.retain.hours"="hours"...]
)
[LIFECYCLE <days>];
以下の表は、TBLPROPERTIES パラメーターについて説明しています。
|
パラメーター |
必須 |
説明 |
注記 |
|
"table.format.version"="2" |
はい |
テーブルフォーマットを Delta Table として宣言します。 |
|
|
acid.data.retain.hours |
いいえ |
デフォルト値は 24 です。有効値の範囲は |
タイムトラベルを使用して既存データの状態をクエリできる時間範囲 (時間単位) です。
|
|
acid.incremental.query.out.of.time.range.enabled |
いいえ |
デフォルト値は |
true に設定すると、増分クエリで指定する endTimestamp がテーブルの最新コミット時刻よりも後になることが許容されます。endTimestamp が現在時刻よりも後の場合、新しいデータが挿入される可能性があるため、複数回のクエリで異なる結果が返されることがあります。 このパラメーターの値はテーブルごとに変更できます。 |
PK Delta Table の作成
-- PK Delta Table の作成
CREATE TABLE <table_name> (
<col_name> <data_type> [NOT NULL] [DEFAULT <default_value>] [comment <col_comment>], ...
PRIMARY KEY (<pk_col_name>[, <pk_col_name2>, ...] )
)
[comment <table_comment>]
TBLPROPERTIES (
"table.format.version"="2"
[, "write.bucket.num" = "N", "acid.data.retain.hours"="hours"...]
)
[LIFECYCLE <days>];
パラメーターは以下のとおりです。
-
PRIMARY KEY (PK):必須です。PK Delta Table を作成する際には、このパラメーターを指定する必要があります。プライマリキーは 1 つ以上の列で構成でき、これらの列の値の組み合わせはテーブル内で一意である必要があります。構文は標準 SQL のプライマリキー構文に従います。プライマリキー列は NOT NULL に設定する必要があり、変更できません。
プライマリキーを設定すると、テーブル内のデータはプライマリキー列に基づいて重複排除されます。一意性制約は、単一のパーティション内または非パーティション化テーブル全体で有効です。
-
以下の表は、TBLPROPERTIES パラメーターについて説明しています。
|
パラメーター |
必須 |
説明 |
注記 |
|
"table.format.version"="2" |
はい |
テーブルフォーマットを Delta Table として宣言します。 |
|
|
write.bucket.num |
いいえ |
デフォルト値は 16 です。有効値の範囲は |
各パーティションまたは非パーティション化テーブルのバケット数です。これは、データ書き込み時の同時実行ノード数を示します。パーティションテーブルの場合、このパラメーターを変更でき、変更はデフォルトで新しいパーティションに適用されます。非パーティション化テーブルの場合は、このパラメーターを変更できません。このパラメーターを使用する際は、以下の点にご注意ください。
|
|
acid.data.retain.hours |
いいえ |
デフォルト値は 24 です。有効値の範囲は |
タイムトラベルを使用して既存データの状態をクエリできる時間範囲 (時間単位) です。
|
|
acid.incremental.query.out.of.time.range.enabled |
いいえ |
デフォルト値は |
true に設定すると、増分クエリで指定する endTimestamp がテーブルの最新コミット時刻よりも後になることが許容されます。endTimestamp が現在時刻よりも後の場合、新しいデータが挿入される可能性があるため、複数回のクエリで異なる結果が返されることがあります。 このパラメーターの値はテーブルごとに変更できます。 |
|
acid.write.precombine.field |
いいえ |
1 つの列名を指定できます。 |
列名を指定すると、同じコミット内のファイル処理時にプライマリキー (PK) 列および指定された列に基づいてデータの重複排除が行われ、データの一意性と整合性が保証されます。 説明
単一コミットのデータ量が 128 MB を超える場合、複数のファイルが生成されます。このパラメーターは複数ファイルには適用されません。 |
|
acid.partial.fields.update.enable |
いいえ |
|
このパラメーターはテーブル作成時に設定してください。テーブル作成後は変更できません。 |
注記
|
項目 |
Append Delta Table |
PK Delta Table |
クラスター化テーブル |
|
バケット数 |
write.bucket.num を指定する必要はありません。バケット数は実際のデータ量に基づいて動的に変化します。 |
DDL 文でバケット数を指定する必要があります。デフォルト値は 16 です。 |
/ |
|
データ構成ポリシー |
RANGE CLUSTERED BY。CLUSTERED BY はサポートされていません。SORT BY フィールドを指定する必要はありません。バケット内のデータは、RANGE CLUSTERED BY で指定されたフィールドに基づいてデフォルトでソートされます。 |
CLUSTERED BY を設定できません。デフォルトでプライマリキーに基づいたハッシュクラスターが作成されます。 |
CLUSTERED BY |
|
ライフサイクル |
タイムトラベルクエリのライフサイクル以上である必要があります。つまり、 |
/ |
/ |
-
既存の標準テーブルを直接 Delta Table に変換することはできません。
-
PK Delta Table は、プライマリキー (PK) 列に対するスキーマ進化をサポートしていません。
-
PK Delta Table は現在、JSON データ型をサポートしていません。
-
CREATE TABLE AS はサポートされていません。
DML
Delta Table は、データの挿入または上書き (INSERT INTO | INSERT OVERWRITE)、UPDATE | DELETE、および MERGE INTO などのデータ操作言語 (DML) 構文をサポートします。
DQL
Delta Table は汎用的なクエリ分析をサポートします。詳細については、「DQL 操作 (SELECT)」をご参照ください。
データインポート
-
Append Delta Table は、バッチデータアップロード (Upload) および ストリームデータアップロード (Stream Upload) を使用したデータインポートをサポートします。Append Delta Table にはプライマリキーがないため、データ送信はアップサートまたは削除操作をサポートしません。
-
PK Delta Table は、Tunnel Upsert/Delete API を使用したデータ書き込みをサポートします。プライマリキーが存在しない場合、アップサート操作により新しい行が挿入されます。プライマリキーがすでに存在する場合、アップサート操作により対応する非プライマリキーフィールドが更新されます。
データ構成の最適化
-
Append Delta Table は、データ構成に基礎となる Range Clustering 構造を使用します。この最適化の詳細については、「Append Delta Table のデータ構成最適化」をご参照ください。デフォルトでは Row_ID がクラスタリングキーとして使用され、データ量の増加に伴ってバケット数が動的に割り当てられます。クラスタリングキーを指定すると、バックグラウンドのクラスタリングタスクがデータに対して増分再クラスタリングを実行し、全体的な順序を維持します。
-
PK Delta Table のデータ構成構造については、「PK Delta Table のデータ構成最適化」をご参照ください。このテーブルは、プライマリキー (PK) フィールドをハッシュバケット化する基礎となる Hash Clustering 構造を使用し、効率的なデータ書き込みおよび更新を実現します。