

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 建立 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) 提供技術基礎設施，可以用來支援各種目標應用程式的資料擷取和複寫，並支援這些案例中的 delta 機制。如果為 delta 程序，來源 (ODP 提供者) 中的資料會使用更新程序自動寫入 delta 佇列 (Operational Delta Queue – ODQ)，或使用擷取器界面傳遞至 delta 佇列。ODP 提供者可以是 DataSource (擷取器)、ABAP Core Data Services Views (ABAP CDS Views)、SAP BW 或 SAP BW/4HANA、SAP Landscape Transformation Replication Server (SLT) 和 SAP HANA Information Views (計算檢視)。目標應用程式 (稱為 ODQ 「訂閱者」或更普遍稱為「ODP 消費者」) 從 delta 佇列中擷取資料並繼續處理資料。

## 完整載入
<a name="sap-odata-full-load"></a>

在 SAP OData 和 ODP 實體的內容中，**完整載入**是指在單一操作中從 ODP 實體擷取所有可用資料的程序。此操作會從來源系統中擷取完整的資料集，確保目標系統擁有實體資料的完整最新副本。完全載入通常用於不支援增量載入的來源或需要重新整理目標系統時。

**範例**

您可以在建立 DynamicFrame 時，明確將 `ENABLE_CDC` 旗標設為 false。注意：`ENABLE_CDC` 預設為 false，如果您不想初始化 delta 佇列，則不需要傳送此旗標或將其設定為 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 (Operational Data Provisioning) 實體內容中的**增量載入**包括自上次資料擷取以來，僅從來源系統擷取新的或變更的資料 (delta)，避免預先處理已處理的記錄。這種方法可大幅提升效率、減少資料傳輸量、提高效能、確保系統之間的高效同步，並將處理時間降至最低，尤其是經常變更的大型資料集。

# Delta Token 型增量傳輸
<a name="sap-odata-incremental-transfers"></a>

對於支援其已啟用 ODP 的實體，若要使用變更資料擷取 (CDC) 啟用增量傳輸，請遵循下列步驟：

1. 在指令碼模式下建立增量傳輸任務。

1. 建立 DataFrame 或 Glue DynamicFrame 時，需要傳遞選項 `"ENABLE_CDC": "True"`。此選項可確保您會收到來自 SAP 的 Delta Token，其可用於後續擷取變更的資料。

Delta Token 會出現在 DELTA\$1TOKEN 資料欄中 dataframe 的最後一列。此字符可用作後續呼叫中的連接器選項，以逐步擷取下一組資料。

**範例**
+ 建立 DynamicFrame 時，我們會將 `ENABLE_CDC` 旗標設定為 `true`。注意：`ENABLE_CDC` 預設為 `false`，如果您不想初始化 delta queue，則不需要傳送此旗標或將其設定為 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
  ```
+ 擷取的 delta token 可以作為選項進行傳遞，以擷取新事件。

  ```
  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 值。

除了 `DELTA_TOKEN` 之外，dataframe 的每一列都會傳回下列欄位。
+ **GLUE\$1FETCH\$1SQ**：這是一個序列欄位，按照記錄接收順序從 EPOC 時間戳記產生，對於每個記錄都是唯一的。如果您需要了解或建立來源系統中的變更順序，則可以使用此功能。只有啟用 ODP 的實體才會出現此欄位。
+ **DML\$1STATUS**：這會顯示來源中所有新插入和更新記錄的 `UPDATED`，以及已從來源中刪除之記錄的 `DELETED`。

如需有關如何管理狀態和重複使用 delta token 以透過範例擷取變更記錄的詳細資訊，請參閱 [使用 SAP OData 狀態管理指令碼](sap-odata-state-management-script.md) 一節。

## Delta Token 失效
<a name="sap-odata-invalidation"></a>

Delta Token 與服務集合和使用者相關聯。如果針對相同的服務集合和使用者啟動具有 `“ENABLE_CDC” : “true”` 的新初始提取，則 SAP OData 服務將使先前初始化後簽發的所有之前的 delta token 失效。使用過期的 delta token 叫用連接器將導致例外狀況：

`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 系統本質上不支援 deltas 等進階資料擷取機制，因此程序非常簡單，但可能會耗費大量資源，具體取決於資料大小。

## 增量載入
<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
```

在下一節中，我們將提供自動化方法來管理這些時間戳記型增量傳輸，無需在執行之間手動更新篩選表達式。