

# SAP OData ジョブの作成
<a name="sap-odata-creating-job"></a>

「[AWS Glue Studio でビジュアル ETL ジョブを作成する](https://docs.aws.amazon.com/glue/latest/dg/author-job-glue.html)」を参照してください。

# オペレーショナルデータプロビジョニング (ODP) ソース
<a name="sap-odata-operational-data-provisioning-sources"></a>

オペレーショナルデータプロビジョニング (ODP) は、さまざまなターゲットアプリケーションのデータ抽出とレプリケーションをサポートするために使用できる技術インフラストラクチャを提供し、これらのシナリオでデルタメカニズムをサポートします。デルタプロシージャの場合、ソース (ODP プロバイダー) からのデータは、更新プロセスを使用してデルタキュー (オペレーションデルタキュー – ODQ) に自動的に書き込まれるか、エクストラクタインターフェイスを使用してデルタキューに渡されます。ODP プロバイダーは、DataSource (エクストラクター）、ABAP Core Data Services ビュー (ABAP CDS ビュー）、SAP BW または SAP BW/4HANA、SAP Landscape Transformation Replication Server (SLT)、SAP HANA Information ビュー (計算ビュー) のいずれかです。ターゲットアプリケーション (ODQ の「サブスクライバー」またはより一般的には「ODP コンシューマー」と呼ばれる) は、デルタキューからデータを取得し、データの処理を続行します。

## フルロード
<a name="sap-odata-full-load"></a>

SAP OData エンティティおよび ODP エンティティのコンテキストにおいて、**フルロード**とは、1 回のオペレーションで ODP エンティティから使用可能なすべてのデータを抽出するプロセスを指します。このオペレーションは、ソースシステムから完全なデータセットを取得し、ターゲットシステムにエンティティのデータの包括的かつ最新のコピーが確実に保持されます。通常、全ロードは、増分ロードをサポートしないソースや、ターゲットシステムの更新が必要な場合に使用されます。

**例**

DynamicFrame を作成するときに、明示的に `ENABLE_CDC` フラグを false に設定できます。注: `ENABLE_CDC` はデフォルトで false です。デルタキューを初期化しない場合は、このフラグを送信したり true に設定したりする必要はありません。このフラグを true に設定しないと、全ロード抽出になります。

```
sapodata_df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "false"
    }, transformation_ctx=key)
```

## 増分ロード
<a name="sap-odata-incremental-load"></a>

ODP (オペレーショナルデータプロビジョニング) エンティティのコンテキストでの**増分ロード**では、前回のデータ抽出以降にソースシステムから新規または変更されたデータ (デルタ) のみを抽出し、すでに処理されたレコードを前処理しないようにします。このアプローチにより、効率が大幅に向上し、データ転送量が削減され、パフォーマンスが向上し、システム間の効率的な同期が保証され、特に頻繁に変更される大規模なデータセットの場合、処理時間が最小限に抑えられます

# デルタトークンベースの増分転送
<a name="sap-odata-incremental-transfers"></a>

変更データキャプチャ (CDC) を使用して、それをサポートする ODP 対応エンティティの増分転送を有効にするには、次の手順に従います。

1. スクリプトモードで増分転送ジョブを作成します。

1. DataFrame または Glue DynamicFrame を作成する際には、オプション `"ENABLE_CDC": "True"` を渡す必要があります。このオプションにより、SAP からデルタトークンを受信できます。このトークンは、変更後のデータの取得に使用できます。

データフレームの最後の行の DELTA\$1TOKEN 列に格納されます。このトークンは、後続の呼び出しでコネクタ オプションとして使用して、次のデータ セットを段階的に取得できます。

**例**
+ DynamicFrameを作成する際に、`ENABLE_CDC` フラグを `true` に設定します。注: `false` はデフォルトで `ENABLE_CDC` です。デルタキューを初期化しない場合は、このフラグを送信したり true に設定したりする必要はありません。このフラグを true に設定しないと、全ロード抽出になります。

  ```
  sapodata_df = glueContext.create_dynamic_frame.from_options(
      connection_type="SAPOData",
      connection_options={
          "connectionName": "connectionName",
          "ENTITY_NAME": "entityName",
          "ENABLE_CDC": "true"
      }, transformation_ctx=key)
  
  # Extract the delta token from the last row of the DELTA_TOKEN column
  delta_token_1 = your_logic_to_extract_delta_token(sapodata_df) # e.g., D20241029164449_000370000
  ```
+ 抽出されたデルタトークンを新しいイベントを取得するためのオプションとして渡すことができます。

  ```
  sapodata_df_2 = glueContext.create_dynamic_frame.from_options(
      connection_type="SAPOData",
      connection_options={
          "connectionName": "connectionName",
          "ENTITY_NAME": "entityName",
          // passing the delta token retrieved in the last run
          "DELTA_TOKEN": delta_token_1
      } , transformation_ctx=key)
  
  # Extract the new delta token for the next run
  delta_token_2 = your_logic_to_extract_delta_token(sapodata_df_2)
  ```

`DELTA_TOKEN` が格納されている最後のレコードは、ソースからのトランザクションレコードではなく、デルタトークン値を渡す目的でのみ存在することに注意してください。

`DELTA_TOKEN` とは別に、データフレームの各行には次のフィールドが返されます。
+ **GLUE\$1FETCH\$1SQ**: これは、レコードが受信された順序で EPOC タイムスタンプから生成されるシーケンスフィールドで、レコードごとに一意です。これは、ソースシステムの変更の順序を確認または確立する必要がある場合に使用できます。このフィールドは、ODP が有効なエンティティにのみ表示されます。
+ **DML\$1STATUS**: これにより、ソースから新しく挿入および更新されたすべてのレコードに対して `UPDATED` が表示され、ソースから削除されたレコードに対して `DELETED` が表示されます。

状態を管理し、差分トークンを再利用して、変更したレコードを取得する方法の詳細については、「[SAP OData 状態管理スクリプトの使用](sap-odata-state-management-script.md)」セクションを参照してください。

## デルタトークンの無効化
<a name="sap-odata-invalidation"></a>

デルタトークンは、サービスコレクションとユーザーに関連付けられます。同じサービスコレクションとユーザーに対して `“ENABLE_CDC” : “true”` を有効にした新しい初期プルが開始されると、以前の初期化の結果として発行された以前のデルタトークンはすべて SAP OData サービスによって無効になります。有効期限が切れたデルタトークンを使用してコネクタを呼び出すと、例外が発生します。

`Could not open data access via extraction API RODPS_REPL_ODP_OPEN` 

# OData サービス (ODP 非対応ソース）
<a name="sap-odata-non-odp-services"></a>

## フルロード
<a name="sap-odata-non-odp-full-load"></a>

ODP (オペレーショナルデータプロビジョニング) に対応していないシステムの場合、**フルロード**では、ソース システムからデータセット全体を抽出し、ターゲットシステムにロードします。ODP に対応していないシステムは、差分などの高度なデータ抽出メカニズムを本質的にサポートしないため、そのプロセスは単純ですが、データのサイズによってはリソースを大量に消費する可能性があります。

## 増分ロード
<a name="sap-odata-non-odp-incremental-load"></a>

**ODP (オペレーショナルデータプロビジョニング）** をサポートしていないシステムまたはエンティティの場合、変更を追跡および抽出をするためのタイムスタンプベースの仕組みを実装することで、増分データ転送を手動で管理できます。

**タイムスタンプベースの増分転送**

ODP 非対応のエンティティの場合 (または ENABLE\$1CDC フラグを使用しない ODP が有効になっているエンティティの場合)、コネクタで `filteringExpression` オプションを使用して、データを取得する `datetime` 間隔を指定できます。この方法は、各レコードが最後に作成/変更された日時を表すデータ内のタイムスタンプフィールドに依存します。

**例**

2024-01-01T00:00:00.000 後に変更されたレコードの取得

```
sapodata_df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "filteringExpression": "LastChangeDateTime >= 2024-01-01T00:00:00.000"
    }, transformation_ctx=key)
```

注: この例では、`LastChangeDateTime` は各レコードが最後に変更された日時を表すフィールドです。実際のフィールド名は、特定の SAP OData エンティティによって異なる場合があります。

後続の実行でデータの新しいサブセットを取得するには、`filteringExpression` を新しいタイムスタンプで更新します。通常、これは以前に取得したデータの最大タイムスタンプ値になります。

**例**

```
max_timestamp = get_max_timestamp(sapodata_df)  # Function to get the max timestamp from the previous run
next_filtering_expression = f"LastChangeDateTime > {max_timestamp}"

# Use this next_filtering_expression in your next run
```

次のセクションでは、これらのタイムスタンプベースの増分転送を管理するための自動化されたアプローチを提供し、実行間でフィルタリング式を手動で更新する必要がなくなります。