このポストについて

このポストは datatech-jp Advent Calendar 2023 の18日目の投稿です。

web の記事で見かけた dlt というツールが気になったので調べてみた。
dlt の概要について書いていく。

What is dlt?

https://dlthub.com/

dlt とは “data load tool” の略。
雑に言うとデータパイプラインにおける ELT の Extract と Load を行う ものとなっている。
主にベルリンとニューヨークに拠点を持つ dltHub 社によって開発されており、OSS の Python ライブラリとして提供されている。

次のような特徴を持つ。

  • プラットフォームではなくあくまでライブラリであることが強調されている
    • つまり Airflow, GitHub Actions, Google Cloud Functions, ローカル環境などどこでも動かすことができる
    • スケールアウト可能な分散処理ではない
  • extract と load にまつわる反復的で平凡な作業をなくすことを目指している
    • schema 推論や schema evolution をサポート
    • 宣言的なコードでメンテナンスを楽にする
    • incremental loading をサポート
  • 豊富な source
    • GA, Salesforce, Kinesis などいろいろ例が挙げられている
    • 要は API からの取得も含めて JSON-like な形式で Python で読めるものなら何でも
  • 豊富な destination
    • BigQuery, Snowflake など主要なクラウド DWH
    • DuckDB はローカルでの動作確認に便利
  • Airflow, dbt などとの連携がある
  • CLI の提供もある

その他、Glossary を見ておくとドキュメントが読みやすくなる。

dlt の仕組み

dlt は内部的には extract, normalize, load の3つのステージを実行する。

  • extract
    • API その他から得られた JSON データを parse する
  • normalize
    • 正規化エンジンにより JSON 入れ子構造をリレーショナルテーブルに展開
    • schema 推論なども含む
  • load
    • destination へと冪等で atomic なロードを行う

荒れがちな取り込みのコードをこの型にはめられるというのがいいところかなと思う。

architecutre diagram from How dlt works | dlt Docs

architecutre diagram from How dlt works | dlt Docs

コード例

以下は Getting Started | dlt Docs に記載のもっともシンプルなコード例。

import dlt

data = [
    {'id': 1, 'name': 'Alice'},
    {'id': 2, 'name': 'Bob'}
]

pipeline = dlt.pipeline(
    pipeline_name='quick_start',
    destination='duckdb',
    dataset_name='mydata'
)
load_info = pipeline.run(data, table_name="users")

print(load_info)

これを quick_start_pipeline.py に保存して、

python quick_start_pipeline.py

のように普通に Python スクリプトとして実行すると DuckDB の mydata.users にデータが load される。

まとめ

ざっとだが dlt がどういったものかを解説した。
Fivetran や Airbyte を用意するほどでもない、データ量もそれほど多くといったライトなケースに dlt の選択肢が出てくるのだろうか。

次のポストでは実際に dlt でパイプラインを構築する開発手順を追ってみたい。
最後に dlthub に記載の Suraj Rajan 氏 (Snowflake の偉い人) の言葉を引用しておく。

DLT + DBT can be a killer combination for customers.

よさそう。
dlt という命名も dbt を意識してる感じがする。