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 データレイクをデルタ レイクに変換するための 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の使用方法を示しています。

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

CONVERT TO DELTAを使用した Parquet データの移行

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

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

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

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

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

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

  • ソースディレクトリ内の既存のファイルをすべて処理します。

  • 自動週次バックフィル ジョブをトリガーして、見落とされた可能性のあるファイルをキャプチャします。

  • Apache Spark で多くの Spark ジョブを使用して、大きなデータ パーティションに関連するスピル エラーやメモリ不足エラーを回避できるようにします。

  • エンドツーエンドの正確な処理保証を提供します。

(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)
)

Auto Loader は Python または SQL のいずれかでDelta Live Tablesで使用できます。

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

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

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

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 へのネイティブ書き込みをサポートしていません。

  • Parquet データを読み取るダウンストリーム システムでは、 Delta Lakeを読み取ることができません。

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

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