👌

Dataikuで実現する「重複しないデータ積み上げ」テクニック

に公開

日々の売上データを扱っていると、
「過去のデータに新しいデータを積み上げたい」
という場面はよくあります。

ただし、同じデータを何度も積み上げてしまうと、
気づかないうちに 重複レコードだらけ になってしまいます。

この記事では、Dataikuで「何度実行しても重複しないデータ積み上げ処理」を実現する方法を紹介します。


前提条件

  • MART:日別・店舗別・商品別の売上データ(既存の基礎データ)
  • new_data:新しく追加したい最新データ

目的は MARTnew_data を積み上げて最新状態を保つこと。
ただし、同じ日付・店舗・商品データを重複して登録しないようにします。


Dataikuの基本:Append instead of overwrite

Dataikuのレシピの出力設定には「Append instead of overwrite」という項目があります。
この設定をオンにすると、毎回の実行時に新しいデータが追加されていきます。

ただし、これをそのまま使うと、同じデータを再実行時に何度も追加してしまうリスクがあります。


重複防止の基本設計

重複を防ぐためには、データに「更新日時カラム(update_datetime)」を追加します。
例えば以下のように、データ作成時刻を文字列で付与します。
update_datetime = 202510071522

このカラムを使って「同じキー(日付・店舗・商品)で最新のデータだけを残す」ことができます。

方法1:Stack + Group By + Join で最新データを抽出する

まずは、堅実で汎用性の高い方法です。

フローの手順

  1. MARTnew_dataStackレシピ で結合し、MART_stacked を作成

  2. MART_stacked に対して Group By レシピ を適用
     - グループキー:日付
     **今回はデータが日別で更新されると想定し、日付のみキーにしています。
      月ごとにデータを更新していくのであれば、月というカラムを作ってそれをキーにするとよいです。
     - 集約カラム:update_datetime_ の最大値(max)

  3. Group By結果を、元の MART_stackedInner Join
     左のキーは日付 & update_datetime、右のキーは日付 & update_datetime_max

  4. 最後に、joinレシピで作ったデータセットのパスを、MARTのパスに変更
    よって、joinレシピの出力がMARTのデータセットに上書き保存します。

結果

  • 日付ごとに「更新日時が最新のレコード」だけを残せます。

メリット

  • 安定しており、大量データにも対応可能
  • 更新履歴を明確に保持できる

注意点

  • フローがやや複雑になる(Stack → Group By → Join の3工程)

方法2:Top N レシピでシンプルに最新だけ残す

Top N レシピを使う方法もあります。

フローの手順

  1. MARTnew_data を Stack で結合
  2. Top N レシピ を使用し、各キーごとに1件だけ残す設定を行う
     並び替えを設定
     - グループキー:日付、店舗ID、商品ID
     - ソートキー:update_datetime 降順(新しい順)
  3. 最後に、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レシピをおすすめします。

truestarテックブログ
設定によりコメント欄が無効化されています