アプリケーションのデータ処理をデータ基盤に寄せる進め方
tl;dr
- データ基盤などがなく、アプリケーション側でデータの処理を実装されているものを、データ基盤を作ってそっちによせる時の進め方の解説です。
- 私はこうしました、という話なので、他に良い方法があれば教えて欲しいです。
- 本当はもっと細かい内容を詰めたりもしていますが、あえて端折っている部分もあります。細かい内容というより、おおまかなプロセスの部分に着目してもらえればと思います。
概要
データ基盤などが用意されていない企業で、アプリケーション側でデータを処理しているような場合、そこで色々賄うのが辛くなり、データ基盤を構築してそこにデータ形処理形を寄せていきたいというのはある話だと思います。
その際に、どのように進めると良かったのかというのを反省しながら、今ならこうするみたいなことを書いてみようと思います。
1.インプットは何?
特に、運用が複雑だと取得したデータを人の目で判断して処理していたり、再現が難しい状態のデータになっていたりすることがあります。
それも含めて、どこにあるデータを処理しているのかというのをまずは明らかにします。
2.アウトプットは何?
現状のテーブルがアウトプットということがほとんどと思いますが、現状の状態が正ではないような場合もあるかと思います。(色々過渡期で目まぐるしくデータの状態が変わるような時は全然あるかなと)
そのような時に、最初から理想のテーブルの状態を決めるのではなく、まずは現状を再現するための要件を決めます。
最適な状態にするのはToBeの中で漸進的に改善していくプロセスの中で進めていけば良いかと思いますので、それはそれで要件として押さえておくと良いかと思います。
3.どのようにデータを処理している?
ここが一番厚い部分かと思います。
実際にアプリケーション側でデータを加工する際には、データ基盤のような考え方でデータを処理することはなく、一つの機能として実装することが多いかと思います。
そのため、その機能の中でバリデーションやデータ加工、API連携などの様々な処理をしていたり、アプリケーション側のメモリの都合でデータをぶつ切りにしながら処理したりしていると思います。
なので、そのままこれらの処理をデータ基盤に持ち込む前にしっかり整理することが必要だと考えています。
整理の進め方としては次のように考えました。
3.1.既存の処理の理解
大きな処理のまとまりをstepにして、stepごとにどういう処理をしているかを整理します。
以下に例を記載します。
- Step1:データロード
- ヘッダースキップ
- 空行スキップ
- etc...
- Step2:バリデーション
- ...
- Step3:API連携
- ...
- Stepx:...
3.2.各処理をカテゴライズしてマッピングする
上記である程度処理を整理して、頭の中にどういう処理をしているかがインプットされたと思います。
そのあとは、実際にそれぞれの処理をデータ基盤によせる際にどのように対応するかをマッピングします。
単純にデータパイプラインに組み込むのか、testとして対応するのか、masterとして連携すべきなのかなどを整理します。
| 処理ステップ | 詳細処理内容 | 実装箇所 | データ基盤分類 | 実装方法 |
|---|---|---|---|---|
| Step 1-1 | CSVファイル読み込み・パース | xxxxx.py:30-35 |
Pipeline (Raw → Staging) | 外部ステージ + SnowPipe |
| Step 1-2 | 空行スキップ | xxxxx.py:42-49 |
Pipeline (Raw → Staging) | xxxxxxxx |
| Step 2-1 | 基本型チェック(文字列、数値等) | yyyyy.py:100-120 |
Data Quality Testing | dbt schema tests |
| Step 2-2 | xxxxxチェックデジット検証 | yyyyy.py:140-180 |
Data Quality Testing | dbt custom macro + Great Expectations |
| Step 3-1 | zzzzz API呼び出し | zzzzz.py:10-40 |
Master Data Management | Python script (事前バッチ) |
| Step 3-2 | かな情報補完 | tttttt.py:110 |
Master Data Management | dbt結合処理 |
| Step x-y | xxxxxxx | xxxxxxxxx |
xxxxxxxx | xxxxxxxx |
3.3.各カテゴリごとにどのように処理するかを整理する
上記まででasisの処理を整理し、それがデータ基盤でどのようにカテゴライズして対応するかを整理しました。
これでこの後にカテゴリごとにどのように対応するかを詳細詰めた後に、実際にそれらの実装をした後でどの処理がどのように実装されたのかの対応が取れているので、後から振り返りやすくなったかと思います。
あとはテストやらパイプラインの実装やらマスタ連携やらは他にいくらでも解説されているかと思うので、ここでは割愛します。
まとめ
ほぼこの記事の中身は上の
- 元の処理を細かく確認し
- データ基盤で処理する時にどのようにカテゴライズし
- カテゴリごとにどのように処理をするか
というところをどのようにマッピングして管理できるようにするか、という内容でした。
ここの対応を最近したので、なんとなく残しておこうと思い記事にしました。
また、今後時間があって気持ちがあれば、アウトプットを漸進的に改善していく部分についても記事にしてみようかと思います。
以上です。
Discussion