メインコンテンツまでスキップ

Parquet データレイクを Delta Lake に移行する

この記事では、既存の Parquet データレイクを Delta Lakeに変換するための推奨事項について説明します。 Delta Lake は、 Databricks レイクハウスの基盤となる形式です。 「Delta Lake とは」を参照してください。

Delta Lake に変換する前の考慮事項

Parquet データレイクには、既存のワークロードとシステムに対して最適化されたパーティション分割戦略がある可能性があります。 Delta Lake に変換してこのパーティション分割構造を維持できますが、パーティション分割されたテーブルが多すぎると、Delta Lake のワークロードが遅くなる主な原因の 1 つになります。 「Databricks でテーブルをパーティション分割するタイミング」と「Spark コードを Databricks に適応させるためのガイドライン」を参照してください。

また、変換されるデータがまだ増加しているかどうか、および現在データがクエリされる頻度も考慮する必要があります。 データレイク内の Parquet テーブルごとに異なるアプローチを選択できます。

Delta Lake 変換のアプローチ

次のマトリックスは、 Parquet データレイクを Delta Lake に変換するための 4 つの主要なアプローチと、いくつかのトレードオフの概要を示しています。 各列を明確にするには、次のようにします。

  • インクリメンタル : 変換の開始後に変換ソースに追加された追加データの変換をサポートする機能を示します。
  • 重複するデータ : データが新しい場所に書き込まれるか、その場で変更されるかを示します。
  • データ構造の維持 : 変換中にパーティション分割戦略が維持されるかどうかを示します。
  • バックフィル データ : 変換の開始後に変換ソースに追加されたデータのバックフィルをサポートする機能を示します。
  • 使いやすさ : データ変換を構成して実行するためのユーザーの作業レベルを示します。

メソッド

インクリメンタル

データが重複する

データ構造を維持します

データのバックフィル

使いやすさ

Deep CLONE Parquet

あり

あり

あり

あり

易しい

Shallow CLONE Parquet

あり

いいえ

あり

あり

易しい

CONVERT TO DELTA

いいえ

いいえ

あり

いいえ

易しい

Auto Loader

あり

あり

いいえ

オプション

いくつかの構成

バッチ Spark ジョブ

カスタムロジック

あり

いいえ

カスタムロジック

カスタムロジック

次のセクションでは、これらの各オプションについて詳しく説明します。

CLONE Parquet を使用した Parquet データの移行

CLONE Parquet を使用して、 Parquet データレイクから Delta Lakeにデータを増分コピーできます。 浅いクローンは、既存の Parquet ファイルへのポインタを作成し、Parquet テーブルを元の場所と形式に維持しながら、収集されたファイル統計を通じて最適化されたアクセスを提供します。 シャロークローンによって作成されたテーブルには、元のデータソースに影響を与えずに書き込むことができます。

ディープクローンは、Delta Lakeへの変換中に、ソースからすべてのデータファイルを新しい場所にコピーします。 ディープクローンを使用すると、ロジックの後続の実行時に、バックフィル操作を含む新しいファイルを段階的に検出できます。 「Parquet テーブルと Iceberg テーブルを Delta Lake に段階的に複製する」を参照してください。

次の例は、 CLONEの使用方法を示しています。

SQL
CREATE OR REPLACE TABLE <target-table-name> [SHALLOW] CLONE parquet.`/path/to/data`;

Parquet データの移行 CONVERT TO DELTA

CONVERT TO DELTA を使用すると、Parquet ファイルのディレクトリを 1 つのコマンドで Delta テーブルに変換できます。テーブルを Delta Lake に変換したら、Parquet ロジックを使用したテーブルの読み取りと書き込みを停止する必要があります。 変換の開始後にターゲット ディレクトリに書き込まれたデータは、結果の Delta テーブルに反映されない場合があります。 「Delta Lake への変換」を参照してください。

次の例は CONVERT TO DELTA の使い方を示しています。

SQL
CONVERT TO DELTA parquet.`gcs://my-bucket/parquet-data`;

Auto Loader を使用した Parquet データの移行

Auto Loader は、クラウド・オブジェクト・ストレージからの増分データ取り込み用に設計された製品ですが、これを活用して、特定のディレクトリーからターゲット・テーブルにすべてのデータを増分コピーするパターンを実装できます。「Auto Loaderとは」を参照してください。

次のコード例には、次のような構成が含まれています。

  • ソースディレクトリ内の既存のすべてのファイルを処理します。
  • 毎週の自動バックフィル ジョブをトリガーして、見逃された可能性のあるファイルをキャプチャします。
  • Apache Spark で多くの Spark ジョブを使用できるようにして、大きなデータ パーティションに関連するスピルやメモリ不足エラーを回避します。
  • エンドツーエンドの正確な1回限りの処理保証を提供します。
Python
(spark.readStream
.format("cloudFiles")
.option("cloudFiles.format", "parquet")
.option("cloudFiles.includeExistingFiles", "true")
.option("cloudFiles.backfillInterval", "1 week")
.option("cloudFiles.schemaLocation", checkpoint_path)
.load(file_path)
.writeStream
.option("checkpointLocation", checkpoint_path)
.trigger(availableNow=True)
.toTable(table_name)
)

DLT では、Auto Loader を Python または SQL と共に使用できます。

カスタム Apache Spark バッチ ロジックを使用した Parquet データの移行

カスタム Apache Spark ロジックを記述すると、ソース システムのさまざまなデータを移行する方法とタイミングを非常に柔軟に制御できますが、他のアプローチに組み込まれた機能を提供するために広範な構成が必要になる場合があります。

このアプローチの中心となるのは、次のような単純な Apache Spark の読み取りおよび書き込み操作です。

Python
spark.read.format("parquet").load(file_path).write.mode("append").saveAsTable(table_name)

バックフィルまたは増分移行を実行するには、データソースのパーティション構造に頼ることができる場合がありますが、ソースから最後にデータをロードしてから追加されたファイルを追跡するカスタムロジックを記述する必要がある場合もあります。 Delta Lake のマージ 機能を使用して重複するレコードの書き込みを回避できますが、大きな Parquet ソース テーブルのすべてのレコードを大きな Delta テーブルの内容と比較することは、計算コストの高いタスクです。

Delta Lakeに変換すべきでないのはいつですか?

既存のすべての Parquet データを Delta Lake に変換する前に、潜在的なトレードオフを考慮する可能性があります。

Databricks は、Delta Lake を中心にレイクハウスの多くの最適化された機能を設計しており、Delta Lake は、多くの言語とエンタープライズ データ システム用の ネイティブ コネクタ を備えた豊富なオープンソース エコシステムを提供します。 Delta Sharing は、Delta Lake に格納されたデータを他のクライアントにも共有する機能を拡張します。

Delta Lake は Parquet の上に構築されているため、Databricks は Parquet ファイルとの対話用に最適化されたリーダーとライターも備えています。

Databricks では、Databricks から定期的な更新またはクエリを受け取るすべてのテーブルに Delta Lake を使用することをお勧めします。 次のような場合、データを Parquet 形式で保持することを選択できます。

  • Parquet にデータを書き込むアップストリーム システムは、Delta Lake へのネイティブ書き込みをサポートしていません。
  • データ read.parquet ダウンストリームシステムは、 Delta Lakeを読み取ることができません。

どちらの場合も、テーブルを Delta Lake にレプリケートして、テーブル内のレコードの読み取り、書き込み、更新、削除時にパフォーマンスの利点を活用することができます。

注記

S3 に格納されている同じ Delta テーブル内のデータを、複数のワークスペースまたはデータ システムから同時に変更することはお勧めしません。 「 S3 での Delta Lake の制限事項」を参照してください。