Lake」のOSS化が発表されました。databricks.comGitHubリポジトリはこちら。LakeはSparkのライブラリとして実装されており、分散ストレージ上で以下のような機能を提供します。2.4.2以降が必要です。ローカルファイルシステムでも動作するのでspark-shellで動きを確認してみました。io.delta:delta-core_2.12:0.1.0まずはテーブルへの書き込みと読み込みをやってみます。Iwobi|Nigeria|+------+----------+-------+追記してみます。Germany|+------+--------------+----------+タイムトラベルで最初のバージョンのテーブルを参照してみます。ここではversionAsOfというオプションでバージョンを指定していますが、timestampAsOfというオプションで日付を指定することもできるようです。Iwobi|Nigeria|+------+----------+-------+スキーマバリデーションを試してみます。数値のフィールドに文字列を入れようとするとこんな感じでエラーになります。...また、存在しないカラムを追加しようとすると以下のようなエラーになります。エラーメッセージにあるようにmergeSchemaオプションを付けるとスキーマを変更できます。schema....ファイルレイアウトや内部動作についてファイルはテーブル毎に以下のようなレイアウトで書き込まれます。データはコミット毎に追加分がParquetで書き込まれ、_delta_logディレクトリに差分情報がJSON形式で保存されます。読み込む際は差分ログをリプレイして必要なParquetファイルを読み込みます。この仕組みによってACIDトランザクション(JSONファイルの書き込みによってコミット)とタイムトラベル(JSONの差分ログをリプレイすることで任意の時点のデータを復元)が可能になっています。トランザクションには楽観的排他制御が使用されており、別トランザクションで先に書き込みが行われた場合はトランザクションが失敗するようになっています。このように差分を積み重ねていく方式のため、一度作成したParquetファイルを更新する必要がなく高速に書き込みを行うことができます。スキーマなどのメタデータもJSONの差分ログ内に書き込まれるので、中央集約型のメタデータストアがボトルネックになることはないという設計のようです。これだけだと履歴が増えるとParquetファイルも増えるので当然読み込みが遅くなります。そのため、_delta_logディレクトリ内にチェックポイント毎にスナップショットのParquetファイルが作成され、スナップショットが存在する場合は実際には直近のスナップショットに対してそれ以降の差分を適用するという動作になります。スナップショットはデフォルトでは10コミット毎に作成されますが、これはテーブルの性質によって調整する必要があると思います。LakeはSparkに特化していることもあり、意外とコンパクトな実装になっています。スナップショットの作成などもSparkの機能が活用されており、実装としては思っていたよりもシンプルなものでした。今後レコードの更新・削除やデータのバリデーションなどもサポート予定のようです。スナップショットをどんどん作っていくのでストレージの消費が大きくなりそうなのと、Spark(の特定バージョン)への依存性といったあたりが懸念材料でしょうか。ファイルレイアウトや仕組み自体はSparkに特化したものではないので他の分散コンピューティングエンジン向けのドライバを書くこともできそうです。コードを読みつつ手元で軽く動かしてみた程度なので見落としている部分もあるかもしれませんが、ひとまずこんなところです。ソースを読み込みつつもう少し研究してみたいと思います。書籍はてなブログをはじめよう!takezoeさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。