

# SAP OData 状態管理スクリプトの使用
<a name="sap-odata-state-management-script"></a>

AWS Glue ジョブで SAP OData 状態管理スクリプトを使用するには、次の手順に従います:
+ パブリック Amazon S3 バケットから状態管理スクリプト: `s3://aws-blogs-artifacts-public/artifacts/BDB-4789/sap_odata_state_management.zip ` をダウンロードします。
+ AWS Glue ジョブがアクセス許可を持つ Amazon S3 バケットにスクリプトをアップロードします。
+ AWS Glue ジョブ内のスクリプトを参照する: AWS Glue ジョブを作成または更新するときは、Amazon S3 バケット内のスクリプトパスを参照する `'--extra-py-files'` オプションを渡します。例: `--extra-py-files s3://your-bucket/path/to/sap_odata_state_management.py`
+ AWS Glue ジョブスクリプトで状態管理ライブラリをインポートして使用します。

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

以下は、デルタトークンベースの増分転送に 状態管理スクリプトを使用する方法の例です。

```
from sap_odata_state_management import StateManagerFactory, StateManagerType, StateType

# Initialize the state manager
state_manager = StateManagerFactory.create_manager(
    manager_type=StateManagerType.JOB_TAG,
    state_type=StateType.DELTA_TOKEN,
    options={
        "job_name": args['JOB_NAME'],
        "logger": logger
    }
)

# Get connector options (including delta token if available)
key = "SAPODataNode"
connector_options = state_manager.get_connector_options(key)

# Use the connector options in your Glue job
df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "true",
        **connector_options
    }
)

# Process your data here...

# Update the state after processing
state_manager.update_state(key, sapodata_df.toDF())
```

## タイムスタンプベースの増分転送の例
<a name="sap-odata-timestamp-incremental-transfer"></a>

以下は、デルタトークンベースの増分転送に 状態管理スクリプトを使用する方法の例です。

```
from sap_odata_state_management import StateManagerFactory, StateManagerType, StateType

# Initialize the state manager
state_manager = StateManagerFactory.create_manager(
    manager_type=StateManagerType.JOB_TAG,
    state_type=StateType.DELTA_TOKEN,
    options={
        "job_name": args['JOB_NAME'],
        "logger": logger
    }
)

# Get connector options (including delta token if available)
key = "SAPODataNode"
connector_options = state_manager.get_connector_options(key)

# Use the connector options in your Glue job
df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "true",
        **connector_options
    }
)

# Process your data here...

# Update the state after processing
state_manager.update_state(key, sapodata_df.toDF())
```

どちらの例でも、状態管理スクリプトはジョブ実行間の状態 (デルタトークンまたはタイムスタンプ) の保存の複雑さを処理します。コネクタオプションを取得するときに最後の既知の状態を自動的に取得し、処理後に状態を更新して、各ジョブ実行が新規または変更されたデータのみを処理するようにします。