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