> ## Documentation Index
> Fetch the complete documentation index at: https://domoinc-openapi-sync-dataflows.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Magic ETLにおけるDataSet更新方法

### はじめに

Magic ETLの出力DataSetタイルには、置き換え、追加、パーティション、Upsertの4つのDataSet更新方法があります。DataFlowの最適な更新方法は、ユースケースによって異なります。

### 更新方法

以下の表に、使用できる各方法の基本的な定義を示します。各方法の詳細については、リンク先を参照してください。

更新方法の詳細については、一般的な「 [DataSet更新方法](/ja/s/article/360043430733) 」（Magic ETL以外の方法）の記事を参照してください。

<table border="1" cellpadding="1" cellspacing="1" data-aura-rendered-by="33:206;a"><thead><tr><th colspan="1" rowspan="1"><p> 項目 </p></th><th colspan="1" rowspan="1"><p> 説明 </p></th></tr></thead><tbody><tr><td colspan="1" rowspan="1"><p><a href="#replace" target="_self"> 置き換え </a></p></td><td colspan="1" rowspan="1"><p> 実行するたびに、出力DataSetの内容が最新の結果に置き換えられます。 </p></td></tr><tr><td colspan="1" rowspan="1"><p><a href="#append" target="_self"> 追加 </a></p></td><td colspan="1" rowspan="1"><p> 実行するたびに、その結果が出力DataSetに新しいバッチとして追加されます。 </p></td></tr><tr><td colspan="1" rowspan="1"><p><a href="#partition" target="_self"> パーティション </a></p></td><td colspan="1" rowspan="1"><p> 実行するたびに、名前（特定の列の値）に従って行がバッチにグループ化されます。DataSet内の固有の各バッチ名は、パーティションと呼ばれます。これらのパーティションはすべてDataSetに追加され、名前が一致する既存のパーティションはすべて置き換えられます。 </p><p> 最終的に、パーティションフィルター式が指定されている場合、すべてのパーティションがその式に対して評価され、パスしなかったものは削除されます。 </p></td></tr><tr><td colspan="1" rowspan="1"><p><a href="#upsert" target="_self"> Upsert </a></p></td><td colspan="1" rowspan="1"><p> 実行するたびに、定義されたキー（DataSet内の一意な行を示す列または列の組み合わせからの値）を使用して、実行結果の行と出力DataSet内の行が比較されます。 <a id="replace" target="_blank" /><br /><br /> 出力DataSet内の既存の行と一致するキーを持つ行は、出力DataSet内で更新されます。 <br /> 出力DataSet内にまだ存在しないキーを持つ行は、出力DataSetに追加されます。 <br /></p></td></tr></tbody></table>

### 置き換え

置き換えは、Magic ETLのデフォルトの更新方法です。これにより、DataSet内の既存のデータがすべて削除され、Magic ETL DataFlowの実行による新しいバッチデータに置き換えられます。この方法は、出力DataSetが比較的小さい場合や、DataFlowを実行するたびにすべてのデータを更新する必要がある場合に適しています。

<Frame>
  <img alt="Replace (1).gif" src="https://mintcdn.com/domoinc-openapi-sync-dataflows/Ngw9EP6XM24-mr0f/images/kb/ka0Vq0000002DkL-00N5w00000Ri7BU-0EM5w000006vuq4.jpg?s=2ee3b77c607d13aded432426993ea71e" style={{width: 710.994, height: 400}} width="960" height="540" data-path="images/kb/ka0Vq0000002DkL-00N5w00000Ri7BU-0EM5w000006vuq4.jpg" />
</Frame>

[このページのトップへ](#intro)

### 追加

追加では、Magic ETL DataFlowの実行に起因するすべてのデータを取得し、出力DataSetに追加します。この方法では、出力DataSet内の既存のデータを一切考慮しないため、重複の可能性を考慮することなしに新しいデータを追加します。追加は、DataFlowを実行するたびに、既存の出力DataSetに新しい行を追加する必要がある場合に適しています。ただし、この更新方法は脆弱であり、データが重複したり欠落したりする可能性があります。

<Frame>
  <img alt="Screenshot 2023-09-19 at 12.42.43 PM.png" src="https://mintcdn.com/domoinc-openapi-sync-dataflows/Ngw9EP6XM24-mr0f/images/kb/ka0Vq0000002DkL-00N5w00000Ri7BU-0EM5w000006vubZ.jpg?fit=max&auto=format&n=Ngw9EP6XM24-mr0f&q=85&s=710dae0643c2a16cb8f765c8eaa59e36" style={{width: 710, height: 453.999}} width="2642" height="1688" data-path="images/kb/ka0Vq0000002DkL-00N5w00000Ri7BU-0EM5w000006vubZ.jpg" />
</Frame>

[このページのトップへ](#intro)

### パーティション

パーティションは、データをグループに整理して、データの更新をより迅速かつ効率的に行う方法です。以下の図は、データをパーティションに置き換えて追加する方法を示しています。

<Frame>
  <img alt="partition graphic.jpg" src="https://mintcdn.com/domoinc-openapi-sync-dataflows/Ngw9EP6XM24-mr0f/images/kb/ka0Vq0000002DkL-00N5w00000Ri7BU-0EM5w000006vuj3.jpg?fit=max&auto=format&n=Ngw9EP6XM24-mr0f&q=85&s=b9acb974384e23a8682319bb289439c6" style={{width: 710, height: 453.999}} width="2000" height="1276" data-path="images/kb/ka0Vq0000002DkL-00N5w00000Ri7BU-0EM5w000006vuj3.jpg" />
</Frame>

# パーティションの基礎

パーティションについては、一般的に、物理的な百科事典（同じセットの一部でありながら個々の異なる巻を集めたもの）に例えて考えると理解しやすいでしょう。例えば、セット内の1巻が改版により再出版された場合、セット全体を取り替えるのではなく、改版された新しい巻だけを購入できます。パーティションは、データを別々のコレクション（サブセット）に分割します。これにより、一部のデータを置き換えるときに、すべてのデータを置き換える必要がなくなります。パーティションの使用時にデータを追加することは、百科事典の新しい巻を購入し、コレクションの最後に追加することに似ています。

Magic ETLでパーティションを定義する場合は、データを論理グループに分割できる列を特定または作成する必要があります。良い例として、トランザクションテーブルの日付列があります。列の各日付はパーティションを表し、各パーティションにはそのパーティション内の複数の行（トランザクション）が含まれます。

DataSetにパーティションが定義されると、新しいデータはパーティション列にもとづいて評価されます。同じパーティション名のデータが出力DataSetに存在する場合、新しいデータは、同じパーティション名で定義された古いデータをすべて置き換えます。そのパーティション名のデータが出力DataSetに存在しないと判断された場合は、新しいデータが新しいパーティションとして出力DataSetに追加されます。

例えば、入力DataSetに3月1日、3月2日、3月3日のデータが含まれている場合（パーティションはその日付にもとづいて定義されている）、出力DataSetの3月1日、2日、3日の既存データは、新しい入力データで置き換えられます。

# パーティションのベストプラクティス

適切なパーティションには、パーティショニングの優れた処理速度を活用するのに十分なサイズと、固有のニーズに対応できる十分な粒度が必要です。

ほとんどの場合、日付ベースの日数レベルのパーティションは、この両方のバランスが取れています。ただし、1つのDataSetに5年を超える日数ベースのパーティションを保持する必要がある場合は、代わりに週レベルまたは月レベルのパーティションの使用を検討することを推奨します。

組織によっては、日数レベルより細かいパーティションを必要とします。このような組織では、DataFlowで2つ以上の列を結合することで、カスタムパーティションを作成できます。例えば、8つの店舗がある場合は、店舗IDと日付を結合したパーティションを作成することを推奨します。

<Warning>
  **重要：** 各DataSetのパーティション数は3,000に制限されています。作成するパーティションの数が多すぎると、この制限に達して問題が発生する可能性があります。前述の例では、ストアIDと日付を使用してパーティションキーを作成する場合、375日分のデータのみを保存できます（3,000のパーティションを店舗数の8で割った数）。
</Warning>

# パーティションを設定する

Magic ETLでDataSetを更新する方法としてパーティションを設定するには、以下の手順を実行します。

<Note>
  **注記：** 以下の手順は、すべての新しいパーティションを含む新規DataFlowを作成する場合に有効です。
</Note>

1. 出力DataSetをMagic ETLキャンバスにドラッグし、選択すると、画面下部のエディターが展開します。
2. エディターの **［設定］** タブ で、更新方法として **［パーティション］** を選択します。
3. **［パーティション列の名］** ドロップダウンから、データの分割に使用する列を選択します。

   <Frame>
     <img alt="Screenshot 2024-09-05 at 3.18.34 PM.png" src="https://mintcdn.com/domoinc-openapi-sync-dataflows/yCOsvW2xnTRbP1fO/images/kb/ka0Vq0000008Ym5-00N5w00000Ri7BU-0EMVq000002ZgKz.jpg?fit=max&auto=format&n=yCOsvW2xnTRbP1fO&q=85&s=f27ba027f52b491eb05f69230c9cb175" style={{width: 799, height: 474}} width="2048" height="1216" data-path="images/kb/ka0Vq0000008Ym5-00N5w00000Ri7BU-0EMVq000002ZgKz.jpg" />
   </Frame>
4. （オプション）出力DataSetに継続的に保持するパーティションの保持ポリシーを設定する場合は、 **［保持するパーティションを指定します］** というラベルの付いたトグルスイッチを切り替えます。
5. （条件付き） **［保持するパーティションを指定します］** オプションを有効にすると、式を入力できるフィールドが表示されます。この式は指定されたパーティションをすべて保持します。その他のパーティションはすべて削除されます。

   **注記：** このフィールドは、「 [partition.name](http://partition.name) 」式のみを検証します。

   <Frame>
     <img alt="Screenshot 2024-09-05 at 3.21.06 PM.png" src="https://mintcdn.com/domoinc-openapi-sync-dataflows/yCOsvW2xnTRbP1fO/images/kb/ka0Vq0000008Ym5-00N5w00000Ri7BU-0EMVq000002ZgXt.jpg?fit=max&auto=format&n=yCOsvW2xnTRbP1fO&q=85&s=0e3740f6cf1a2b71e4f68b29f7920ffe" style={{width: 798, height: 451}} width="2048" height="1158" data-path="images/kb/ka0Vq0000008Ym5-00N5w00000Ri7BU-0EMVq000002ZgXt.jpg" />
   </Frame>

   <Tip>
     **ヒント：** DataFlowにサブセット処理を追加する方法については、「 [Magic ETLのサブセット処理](/s/article/000005150) 」を参照してください。
   </Tip>

[このページのトップへ](#intro)

### Upsert

Upsertでは、行レベルの固有のキーにもとづき、DataSet全体を再処理せずに、出力DataSetの行を更新できます。以下の図は、Upsertによるデータの置き換えと追加を表しています。

<Frame>
  <img alt="merge graphic.jpg" src="https://mintcdn.com/domoinc-openapi-sync-dataflows/Ngw9EP6XM24-mr0f/images/kb/ka0Vq0000002DkL-00N5w00000Ri7BU-0EM5w000006vuff.jpg?fit=max&auto=format&n=Ngw9EP6XM24-mr0f&q=85&s=c3de80faa2f50b2c890871f2dedd2d71" style={{width: 710, height: 453.999}} width="1592" height="1020" data-path="images/kb/ka0Vq0000002DkL-00N5w00000Ri7BU-0EM5w000006vuff.jpg" />
</Frame>

# Upsertの基本

Upsertでは、DataSet全体をDataFlowの実行ごとに置き換えたり、DataFlowの実行で受信するすべての行を追加したりするのではなく、受信した行が新規レコードであるか出力DataSetの既存の行であるかに応じて、データの追加または置き換えが行われます。

Upsertではキーを使用します。このキーは、DataFlowの実行によって生成されたレコードが新規であるか、出力DataSetに既に存在するかを示します。行のキー値が既存の行のキー値と一致する場合、既存の行は受信行に置き換えられます。一致する値がない場合、受信行は新しい行として扱われ、出力DataSetに追加されます。

# Upsertのベストプラクティス

Upsertキーは、単一の行の値、または複数の行の値の組み合わせにすることができますが、その行の一意性を示す必要があります。列内に重複する値がある場合は、Upsertキーを特定することができません。また、列にNULL値が含まれている場合も、Upsertキーを特定できません。

Upsertが更新方法として適しているのは、DataSet全体に散在する個々のレコードを不定期に更新する必要があり、その際に更新されるレコードの数が比較的少ない場合です。Upsertが適さないのは、毎回DataSet内の多くのレコードまたはほとんどのレコードを置換する場合です（このような場合には、 [置き換え](#replace) を使用するとパフォーマンスが向上します）。

Magic ETL DataFlowの更新方法としてUpsertが利用できることで、出力DataSetを更新するために再帰的なDataFlowを作成する必要がなくなります。

# Upsertの設定

Magic ETLでDataSetを更新する方法としてUpsertを設定するには、以下の手順を実行します。

1. 出力DataSetをMagic ETLキャンバスにドラッグし、選択すると、画面下部のエディターが展開します。
2. エディターの **［設定］** タブで、 **［更新方法］** ドロップダウンから［Upsert］を選択します。
3. **［Upsertキー］** ドロップダウンから、データのUpsertキーを識別するのに使用する列を選択します。

   <Frame>
     <img alt="upsert output.jpg" src="https://mintcdn.com/domoinc-openapi-sync-dataflows/yCOsvW2xnTRbP1fO/images/kb/ka0Vq0000008Ym5-00N5w00000Ri7BU-0EMVq000002Zipp.jpg?fit=max&auto=format&n=yCOsvW2xnTRbP1fO&q=85&s=1efb9e72d6edde5f32e4e70c9c4c14a6" style={{width: 800, height: 422}} width="2298" height="1212" data-path="images/kb/ka0Vq0000008Ym5-00N5w00000Ri7BU-0EMVq000002Zipp.jpg" />
   </Frame>

[このページのトップへ](#intro)

日本語
