web-dev-qa-db-ja.com

デルタレイクロールバック

デルタレイクを以前のバージョンにロールバックするためのエレガントな方法が必要です。

私の現在のアプローチは以下のとおりです。

import io.delta.tables._

val deltaTable = DeltaTable.forPath(spark, testFolder)

spark.read.format("delta")
  .option("versionAsOf", 0)
  .load(testFolder)
  .write
  .mode("overwrite")
  .format("delta")
  .save(testFolder)
 _

データセット全体を書き換える必要があるため、これは醜いですが。いくつかのメタ更新が十分であり、データI/Oは必要ないと思われる。誰もがこれへのより良いアプローチを知っていますか?

7
Fang Zhang

あなたは時間旅行機能を使うべきです: https://databricks.com/blog/2019/02/04/introding-delta-time-travel-forlarge-scale-data-lakes.html

タイムスタンプのようにデータを読みます。

val inputPath = "/path/to/my/table@20190101000000000"
 _

その後、「ロールバック」バージョンで既存のデータを上書きしてください。

それが醜いことに関しては、私は助けることができるよくわかりません。パーティション化を使用してデータを制限することができます。あるいは、どのレコードが変更され、どのレコードが変更され、それらを上書きすることができます。

1
simon_dmorias

私はDeltaに関する類似の問題に直面していました、ここで私は1つのトランザクションで複数のDML操作を呼んでいました。例えば私はマージを呼び出して1つのトランザクションで削除するという要件を持っていました。したがって、この場合、それらの両方が一緒に成功するか、それらのいずれかが失敗した場合は状態をまとめる必要があります。

問題を解決するために、トランザクションが開始される前に、_delta_log(それを安定状態に呼び出しましょう)ディレクトリのバックアップを取得しました。トランザクションの両方のDML操作が成功した場合は、以前の安定状態を破棄し、DML操作のいずれかが失敗した場合は_DELTA_LOGディレクトリを前にバックアップした安定状態と置き換えるだけで、_DELTA_LOGでコミットされた新しい状態を使用します。トランザクションを開始します。一度安定状態に置き換えられたら、掃除機を実行して、トランザクション中に作成された可能性がある古いファイルを削除します。

0
saurav