1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

復習も兼ねてこちらをウォークスルーします。

「Delta Lakeって結局なんだって」となることもあり、こちらの本でも復習してみました。無料でダウンロードできます。

Delta Lakeを理解するにはレイクハウスの概念の理解も重要です。

データウェアハウス、データレイクに次ぐアーキテクチャであるレイクハウス、上記書籍のP14に説明があります。

レイクハウスとは、ACIDトランザクション、データのバージョン管理、監査、インデックス、キャッシュ、クエリーの最適化のような分析DBMSの管理機能やパフォーマンス機能も提供する低コストかつ直接アクセス可能なストレージをベースにして構築されたデータ管理システムです。

ですので、レイクハウスのデータストアはストレージ、一般的にはクラウドのオブジェクトストレージです。データをオブジェクトストレージに格納しながらもDBMSの機能を活用できます。

では、このような仕組みをどのように実装するのか?となるわけですが、DatabricksではDelta Lakeを用いてこれを実現しています。

Delta Lakeの説明も上記書籍のP18にあります。

Delta Lakeは、データレイクのストレージフォーマットとメタデータ、キャッシュ機能、インデックス機能を組み合わせたオープンなテーブルフォーマットです。これらは、ACIDトランザクションやその他の管理機能を提供するための抽象化レベルを提供します。<中略>Delta Lakeは、ACIDトランザクション、スケーラブルなメタデータ操作、バッチからストリーミングをカバーする統合処理モデル、完全の監査履歴、SQLのデータ操作言語(DML)のサポートを提供します。

Delta Lake形式でデータを格納することで、上述の機能を活用することができ、データはオブジェクトストレージに格納しておきながらも、DBMSで必要となる機能を利用できるようになります。これによって、上述のレイクハウスを実現しているわけです。

このことから、以下のチュートリアルではテーブルを操作していく流れとなります。

テーブルの作成

Python
# ソースからのデータロード
df = spark.read.load("/databricks-datasets/learning-spark-v2/people/people-10m.delta")

# テーブルへのデータの書き込み
table_name = "takaakiyayoi_catalog.delta_tutorial.people_10m"
df.write.saveAsTable(table_name)

テーブルが作成されました。
Screenshot 2023-12-15 at 17.31.05.png

テーブルのメタデータの表示

SQLのDESCRIBE DETAILを使います。

Python
display(spark.sql('DESCRIBE DETAIL takaakiyayoi_catalog.delta_tutorial.people_10m'))

Screenshot 2023-12-15 at 17.33.08.png

テーブルのUPSERT

UPSERTはUPDATE + INSERTです。更新対象のテーブルにマッチするテーブルがあればUPDATE、マッチしない場合にはINSERTを行います。

以下の例では最初のブロックで一時ビューpeople_updatesを作成しています。一時ビューとはSparkセッションでのみ有効なビューです。その後のブロックでMERGE INTOでUPSERTを実行します。

SQL
%sql
CREATE OR REPLACE TEMP VIEW people_updates (
  id, firstName, middleName, lastName, gender, birthDate, ssn, salary
) AS VALUES
  (9999998, 'Billy', 'Tommie', 'Luppitt', 'M', '1992-09-17T04:00:00.000+0000', '953-38-9452', 55250),
  (9999999, 'Elias', 'Cyril', 'Leadbetter', 'M', '1984-05-22T04:00:00.000+0000', '906-51-2137', 48500),
  (10000000, 'Joshua', 'Chas', 'Broggio', 'M', '1968-07-22T04:00:00.000+0000', '988-61-6247', 90000),
  (20000001, 'John', '', 'Doe', 'M', '1978-01-14T04:00:00.000+000', '345-67-8901', 55500),
  (20000002, 'Mary', '', 'Smith', 'F', '1982-10-29T01:00:00.000+000', '456-78-9012', 98250),
  (20000003, 'Jane', '', 'Doe', 'F', '1981-06-25T04:00:00.000+000', '567-89-0123', 89900);

MERGE INTO takaakiyayoi_catalog.delta_tutorial.people_10m
USING people_updates
ON people_10m.id = people_updates.id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;
SQL
%sql
CREATE OR REPLACE TEMP VIEW people_updates (
  id, firstName, middleName, lastName, gender, birthDate, ssn, salary
) AS VALUES
  (9999998, 'Billy', 'Tommie', 'Luppitt', 'M', '1992-09-17T04:00:00.000+0000', '953-38-9452', 55250),
  (9999999, 'Elias', 'Cyril', 'Leadbetter', 'M', '1984-05-22T04:00:00.000+0000', '906-51-2137', 48500),
  (10000000, 'Joshua', 'Chas', 'Broggio', 'M', '1968-07-22T04:00:00.000+0000', '988-61-6247', 90000),
  (20000001, 'John', '', 'Doe', 'M', '1978-01-14T04:00:00.000+0000', '345-67-8901', 55500),
  (20000002, 'Mary', '', 'Smith', 'F', '1982-10-29T01:00:00.000+0000', '456-78-9012', 98250),
  (20000003, 'Jane', '', 'Doe', 'F', '1981-06-25T04:00:00.000+0000', '567-89-0123', 89900);

MERGE INTO takaakiyayoi_catalog.delta_tutorial.people_10m
USING people_updates
ON people_10m.id = people_updates.id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;

確認のために以下のSQLを実行します。

SQL
%sql
SELECT
  firstName,
  middleName,
  lastName,
  salary
FROM
  takaakiyayoi_catalog.delta_tutorial.people_10m
WHERE
  id in (
    9999998,
    9999999,
    10000000,
    20000001,
    20000002,
    20000003
  )

3行のみがヒットします。
Screenshot 2023-12-15 at 17.58.39.png

上のMERGEを実行します。そして、再度SELECTを実行します。

SQL
%sql
SELECT
  firstName,
  middleName,
  lastName,
  salary
FROM
  takaakiyayoi_catalog.delta_tutorial.people_10m
WHERE
  id in (
    9999998,
    9999999,
    10000000,
    20000001,
    20000002,
    20000003
  )

既存のレコードのsalaryが更新され、新たに3行が追加されました。

Screenshot 2023-12-15 at 18.19.59.png

テーブルの読み込み

Python
people_df = spark.read.table(table_name)

display(people_df)

Screenshot 2023-12-15 at 18.22.13.png

SQLでも同じ結果を得ることができます。

SQL
%sql
SELECT * FROM takaakiyayoi_catalog.delta_tutorial.people_10m;

テーブルの更新

UPDATEで行けます。

SQL
%sql
UPDATE takaakiyayoi_catalog.delta_tutorial.people_10m SET gender = 'Female' WHERE gender = 'F';
UPDATE takaakiyayoi_catalog.delta_tutorial.people_10m SET gender = 'Male' WHERE gender = 'M';

gender列が置き換えられました。
Screenshot 2023-12-15 at 18.26.47.png

テーブル履歴の表示

Delta Lakeのテーブルでは更新処理がすべて記録されます。DESCRIBE HISTORYで履歴を表示できます。

%sql
DESCRIBE HISTORY takaakiyayoi_catalog.delta_tutorial.people_10m

Screenshot 2023-12-15 at 18.28.18.png

特定バージョンのテーブルのクエリー(タイムトラベル)

バージョン番号を指定してクエリーを行うことができます。

SQL
%sql
SELECT
  *
FROM
  takaakiyayoi_catalog.delta_tutorial.people_10m VERSION AS OF 0
WHERE
  id in (
    9999998,
    9999999,
    10000000,
    20000001,
    20000002,
    20000003
  )

UPSERT前の状態が表示されます。
Screenshot 2023-12-15 at 18.30.08.png

Optimizeによるテーブルの最適化

Delta Lakeの実態はオブジェクトストレージに保存されるファイルです。これに対して様々な更新処理を行うとファイルは小さいものに断片化していきます。この状態では複数ファイルにアクセスすることになり、検索性能の悪化につながります。

テーブルの更新で断片化したファイルをコンパクトにまとめることで検索性能を改善できます。OPTIMIZEコマンドを使います。

SQL
%sql
OPTIMIZE takaakiyayoi_catalog.delta_tutorial.people_10m;

Z-orderによる検索性能改善

さらに検索性能を改善するために、検索キーの値が近しいファイルを局所化することができます。これがZ-orderingです。

SQL
%sql
OPTIMIZE takaakiyayoi_catalog.delta_tutorial.people_10m
ZORDER BY (gender)

Screenshot 2023-12-15 at 18.35.50.png

OPTIMIZEコマンドも処理に時間を要しますので、深夜のバッチなどで動かすことが推奨となります。

Vacuumによるクリーンアップ

Delta Lakeテーブルを更新していくと、参照されないファイルなども発生します。これら古くなったファイルを削除するためにはVacuumコマンドを使用します。これによって、ストレージコストを削減できます。

SQL
%sql
VACUUM takaakiyayoi_catalog.delta_tutorial.people_10m

(理論上)容量無制限で低コストなオブジェクトストレージ上で様々なデータを効率にハンドリングできるようになるDelta Lake、ぜひお試しください!DatabricksではデフォルトフォーマットがDelta Lakeなので何も気にせずに活用いただけます。

Databricksクイックスタートガイド

Databricksクイックスタートガイド

Databricks無料トライアル

Databricks無料トライアル

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?