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 トランザクション | Read Committed/Snapshot Isolation。 詳細については、「ACID トランザクション管理」をご参照ください。 | サポート | サポート |
プライマリキー | プライマリキーを定義します。 | 非サポート | 部分的な列の更新をサポート |
スキーマ進化 | 列の追加、削除、名前変更、並べ替え、データ型の変更。 詳細については、「ALTER TABLE」をご参照ください。 | サポート | 対応 |
データインポート |
| ストリーム/バッチアップロード データはストリームアップロード後すぐに可視化されます。 | Upsert |
タイムトラベル | 時点またはバージョン番号による履歴スナップショットのクエリをサポートし、結果の再現や監査分析を実行します。 詳細については、「タイムトラベル」をご参照ください。 | サポート | サポート |
増分コンピューティング | Delta Live マテリアライズドビュー (MV) と増分読み取り。 詳細については、「増分コンピューティング」および「増分クエリ」をご参照ください。 | サポート (増分マテリアライズドビューは適合中です。) | サポート |
データ編成の最適化 | 小規模ファイルのマージ、マルチレベルの COMPACTION、データソートなどの最適化を含む増分データファイルを自動的にメンテナンスし、データストレージとコンピューティングを安定した効率的な状態に保ちます。 詳細については、「Append Delta Table のデータ編成の最適化」および「PK Delta Table のデータ編成の最適化」をご参照ください。 | サポート バケット数を設定する必要はありません。動的バケットはデータ分布に自動的に適応します。 | サポート |
クエリパフォーマンスの最適化 | パーティションレベルおよびファイルレベルの統計 (Min/Max など)、パーティションプルーニング、列プルーニング、および述語プッシュダウン。 | サポート | サポート |
セキュリティとコンプライアンス | ストレージ暗号化 / 動的データマスキング / 行レベルのアクセスコントロールなど。 | サポート | サポート |
ディザスタリカバリとバックアップ | テーブルスナップショットの概要 (招待制プレビュー) / ごみ箱モードでのローカルバックアップ / ゾーンディザスタリカバリ。 | サポート | サポート |
コスト | AliORC 列ストア圧縮と階層化ストレージ。 | サポート | サポート |
ユーザーエクスペリエンス
リアルタイムサービスのためのリアルタイムデータ更新
Delta Table は Stream Upload を通じてリアルタイムのデータ書き込みと更新 (upsert) をサポートします。データは書き込み後すぐに可視化されます。データ書き込みのリアルタイムパフォーマンスとクエリパフォーマンスのバランスを取るために、MaxCompute は階層化ストレージと最適化戦略を使用します:
リアルタイム書き込みの保証:新しいデータはまず、ソートされずに非クラスター化バケットに迅速に書き込まれます。このプロセスにより、データ書き込みの低レイテンシーと高スループットが保証されます。
SQL クエリパフォーマンスの向上:バックグラウンドの増分再クラスタリングサービスが、増分データを非同期に再編成し、ソートされたクラスター化バケットに最適化します。クエリを実行すると、クエリエンジンはソートされたベースデータを効率的にプルーニングし、少量の増分データのみをスキャンできます。このアプローチは、データの鮮度とクエリ効率のバランスを取ります。
効率的な増分データ処理と分析
基盤となる増分データの読み書き機能に基づいて、MaxCompute はエンドツーエンドのデータ分析の適時性を向上させるための豊富な高レベル機能を提供します。増分コンピューティングや動的マテリアライズドビュー (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 などのオープンソースエンジンも、コネクタとオープンストレージ 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 にはプライマリキーがないため、データ転送では Upsert または Delete 操作はサポートされません。
PK Delta Table は、Tunnel Upsert/Delete API を使用したデータ書き込みをサポートします。プライマリキーが存在しない場合、Upsert 操作は新しい行を挿入します。プライマリキーが既に存在する場合、Upsert 操作は対応する非プライマリキーフィールドを更新します。
データ編成の最適化
Append Delta Table は、データ編成に基盤となる Range Clustering 構造を使用します。この最適化の詳細については、「Append Delta Table のデータ編成の最適化」をご参照ください。デフォルトでは、Row_ID がクラスタリングキーとして使用され、データ量の増加に応じてバケット数が動的に割り当てられます。Cluster Key を指定すると、バックグラウンドのクラスタリングジョブがデータに対して増分再クラスタリングを実行し、全体の順序を維持します。
PK Delta Table のデータ編成構造については、「PK Delta Table のデータ編成の最適化」をご参照ください。このテーブルは、基盤となる Hash Clustering 構造を使用して、プライマリキー (PK) フィールドをハッシュバケット化することで、効率的なデータ書き込みと更新を可能にします。