Dataikuで実現する「重複しないデータ積み上げ」テクニック
日々の売上データを扱っていると、
「過去のデータに新しいデータを積み上げたい」
という場面はよくあります。
ただし、同じデータを何度も積み上げてしまうと、
気づかないうちに 重複レコードだらけ になってしまいます。
この記事では、Dataikuで「何度実行しても重複しないデータ積み上げ処理」を実現する方法を紹介します。
前提条件
- MART:日別・店舗別・商品別の売上データ(既存の基礎データ)
- new_data:新しく追加したい最新データ
目的は MART
に new_data
を積み上げて最新状態を保つこと。
ただし、同じ日付・店舗・商品データを重複して登録しないようにします。
Dataikuの基本:Append instead of overwrite
Dataikuのレシピの出力設定には「Append instead of overwrite」という項目があります。
この設定をオンにすると、毎回の実行時に新しいデータが追加されていきます。
ただし、これをそのまま使うと、同じデータを再実行時に何度も追加してしまうリスクがあります。
重複防止の基本設計
重複を防ぐためには、データに「更新日時カラム(update_datetime)」を追加します。
例えば以下のように、データ作成時刻を文字列で付与します。
update_datetime = 202510071522
このカラムを使って「同じキー(日付・店舗・商品)で最新のデータだけを残す」ことができます。
方法1:Stack + Group By + Join で最新データを抽出する
まずは、堅実で汎用性の高い方法です。
フローの手順
-
MART
とnew_data
を Stackレシピ で結合し、MART_stacked
を作成 -
MART_stacked
に対して Group By レシピ を適用
- グループキー:日付
**今回はデータが日別で更新されると想定し、日付のみキーにしています。
月ごとにデータを更新していくのであれば、月というカラムを作ってそれをキーにするとよいです。
- 集約カラム:update_datetime_
の最大値(max) -
Group By結果を、元の
MART_stacked
と Inner Join
左のキーは日付 & update_datetime、右のキーは日付 & update_datetime_max
-
最後に、joinレシピで作ったデータセットのパスを、MARTのパスに変更
よって、joinレシピの出力がMARTのデータセットに上書き保存します。
結果
- 日付ごとに「更新日時が最新のレコード」だけを残せます。
メリット
- 安定しており、大量データにも対応可能
- 更新履歴を明確に保持できる
注意点
- フローがやや複雑になる(Stack → Group By → Join の3工程)
方法2:Top N レシピでシンプルに最新だけ残す
Top N レシピを使う方法もあります。
フローの手順
-
MART
とnew_data
を Stack で結合 -
Top N レシピ を使用し、各キーごとに1件だけ残す設定を行う
並び替えを設定
- グループキー:日付、店舗ID、商品ID
- ソートキー:update_datetime
降順(新しい順)
- 最後に、Top N レシピで作ったデータセットのパスを、MARTのパスに変更
よって、Top N レシピの出力がMARTのデータセットに上書き保存します。
結果
- 各キーごとに最新の1件のみが抽出されます。
メリット
- フロー構成がシンプルでわかりやすい
注意点
- グループキーの指定が適切でないと誤ってデータを削除してしまい、、
データを最小粒度で維持できなくなる可能性があります。
まとめ
Dataikuの「Append instead of overwrite」は便利ですが、そのまま使うと重複が発生しがちです。
そこで重要なのが、更新日時カラムを追加し、最新のみを抽出する処理を入れること。
どちらの方法も、「何度実行してもデータが増えない」安全な積み上げを実現できます。
補足:フローイメージ
この記事で紹介した構成は、次のようなイメージになります。
Dataiku上でも視覚的に確認できるため、データ更新ロジックを理解しやすいのが特徴です。
Dataikuでのデータ運用は、GUIで柔軟に構築できる一方で、設定のちょっとした違いが結果を大きく変えます。
「積み上げても増えない設計」を意識することで、より安定したデータ更新フローを作ることができます。
補足:Stackレシピについて
積み上げ処理は、Stackレシピだけでなく、Syncレシピでも実現できます。
Syncレシピの出力データセットで「Append instead of overwrite」を有効にすれば、同様に新しいデータを積み上げられます。
ただし注意点として:
- 「Append instead of overwrite」設定が有効かどうかは、フロービュー上からは確認できません。
- そのため、明示的に「積み上げを行っている」とわかる Stackレシピ の方が、後から見返したときにフロー構造を理解しやすいです。
つまり、どちらでも動作は可能ですが、可読性・メンテナンス性を重視するなら Stackレシピをおすすめします。