このポストについて
このポストは datatech-jp Advent Calendar 2023 の18日目の投稿です。
web の記事で見かけた dlt というツールが気になったので調べてみた。
dlt の概要について書いていく。
What is dlt?
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 なロードを行う
荒れがちな取り込みのコードをこの型にはめられるというのがいいところかなと思う。
コード例
以下は 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 を意識してる感じがする。