kedroで01_rawのディレクトリ構造に合わせて各フェーズのデータを出力する

以前kedroのドキュメントを見たときに推奨されるデータ管理用のディレクトリ構造が定義されているのを見つけた。
https://kedro.readthedocs.io/en/stable/12_faq/01_faq.html#what-is-data-engineering-convention

整理しやすそうだと思ったため自前のスクリプトを書く際にも流用していたのだが、なかなかよかったのでkedro自体も実際に使ってみることにした。

全データの中から範囲を変えてグルーピングしていくつかのデータセットにしたいことがあったのだが、素のままでやる場合

  • それぞれグループ毎にcatalog.ymlに定義を追加
  • 追加した定義を利用するようpipelineの定義を追加

とする必要がありそうだった。設定やコードとして書かれることでわかりやすいとも言えるのだが、これがもっと増えた場合は似たような定義が並んでわかりづらいのと、そもそもデータを変えるためだけに毎回これを追記していくのはちょっと面倒。

なのでもっと簡単にできないか調べてみたところこんな記事を見つけた

Kedroにおける特徴量のバージョニング方法の一案 - Qiita

catalog.ymlでtemplate変数を使うというのはまさにイメージしてた解決策なのでこちらの方針でやってみることにした。

template変数を導入する方法自体は公式のドキュメントにも書いてある。
https://kedro.readthedocs.io/en/0.17.6/04_kedro_project_setup/02_configuration.html?highlight=template#template-configuration

kedro run実行時に引数から設定できるようにしたいが、今回はparameters.ymlをcli上から上書きする際の方法を流用することにした。

hooks.pyを以下のよう変更

def register_config_loader(
    self, conf_paths: Iterable[str], env: str, extra_params: Dict[str, Any],
) -> ConfigLoader:
        return TemplatedConfigLoader(
            conf_paths,
            globals_pattern="*globals.yml",  # read the globals dictionary from project config
            globals_dict=extra_params,
        )

extra_paramsにparamsのオプションで渡した値が入ってきて、globals.ymlで定義されている値を上書きしてくれる。

これにより、globals.ymlにてデフォルトの設定を書きつつ以下のような形で引数による変更が可能

kedro run --params "dataset:example_dataset"

catalog.ymlの設定としては

raw_data:
    type: pandas.CSVDataSet
    path: data/01_raw/${dataset}/data.csv

primary_data:
    type: pandas.CSVDataSet
    path: data/03_primary/${dataset}/data.csv

...

のように各フェーズで利用するcatalogのpathとして${dataset}を含むようにしておく。あとは01_rawに使いたいデータを用意した上でdatasetをparamsで渡せばそれに応じたデータを使ってパイプラインの処理を行える。