こんにちは、chanyou です。 2024年の datatech-jp のアドカレ では、Data Contract CLI の実装を読み解く という記事を執筆しました。
記事でも触れていましたが Data Contract CLI へコントリビュートしたいと思いつつも、なかなか実現できずにいました。 が、思い切って以前からあったらいいなと思っていた機能の提案と実装をしまして、無事に v0.10.21 で反映されました。
これにより Data Contract CLI の利用シーンがさらに広がりそうなので、今回はその内容を紹介します。
実装した内容 #
記事タイトルにもある通り、Data Contract CLI の export コマンドに custom format を追加しました。 これにより、Data Contract から Jinja テンプレートを利用して任意の形式で出力できるようになります。
例えば、以下のような Jinja テンプレートファイル template.txt
があるとします。
title: {{ data_contract.info.title }}
このテンプレートを custom format として出力すると、以下のように変数 data_contract.info.title
が展開されます。
$ datacontract export --format custom --template template.txt datacontract.yaml
title: Orders Latest
実装した背景と想定されるユースケース #
今回の機能により、固有のロジックを注入した出力が容易になりました。 従来は、独自のロジックを組み込んだ出力を行うために専用の Exporter を実装する必要がありました。 その方法は、Data Contract CLI を Python モジュールとしてインポートし、いくつかのクラスを定義するという手間がかかるものでした。
しかし、custom format を利用することで、Jinja テンプレートを用意するだけで柔軟な出力が可能となります。 例えば、Data Contract からドメイン固有のロジックを含む dbt の model を自動生成したり、独自の見出しやフッターを持つ Markdown ファイルを生成したりすることができます。
詳細な経緯については、Issue を立てたので、気になる方はぜひご覧ください。 すぐに「いい感じ」とレスをいただけて、提案からマージまでスムーズでした。
まとめ #
独自の形式で出力したい場合、Exporter を新たに定義する必要がなく、custom format を用いることで手軽に出力が可能となりました。 もちろん Jinja テンプレートでは複雑すぎるロジックを含む場合や、Web API などの外部のリソースを参照して動的に出力内容を変える場合などには custom format は対応できませんが、一般的なデータパイプラインの構築、データ品質テスト、データカタログなど、自動化が求められる幅広いシーンで活用できると思います。
個人的には Data Contract Driven なデータ基盤の構築を目指しており、その第一歩として活用していきたいと思います。
また、迅速にフィードバックとレビューをいただいた @jochenchrist 氏と @simonharrer 氏に感謝しています。ありがとうございます。
この記事でご紹介した内容は、2025-02-17 に開催予定の 全日本datacontract-cliを使い倒す会 でも触れたいと思っています。オンライン開催予定なので、もしよければ気軽に覗いてみてください。