

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

# 從特徵群組中刪除記錄
<a name="feature-store-delete-records"></a>

您可以透過 Amazon SageMaker Feature Store API 從特徵群組中刪除記錄。特徵群組是包含機器學習 (ML) 資料的物件，其中資料欄由特徵描述，而您的資料則包含在記錄中。記錄包含與特定記錄識別符相關聯的特徵值。

特徵群組有兩種儲存組態：線上儲存和離線儲存。線上儲存只會保留最新事件時間的記錄，通常用於機器學習 (ML) 推論的即時查詢。離線儲存會保留所有記錄，並做為歷史資料庫，通常用於特徵探索、機器學習 (ML) 訓練和批次推論。

若要取得有關特徵商店概念的更多資訊，請參閱[擷取圖](feature-store-concepts.md#feature-store-concepts-ingestion)。

有兩種方法可以從特徵群組中刪除記錄，並且行為會根據儲存組態而有所不同。在下列主題中，我們將說明如何從線上和離線儲存軟刪除和硬刪除記錄，並提供範例。

**Topics**
+ [從線上儲存刪除記錄](#feature-store-delete-records-online-store)
+ [從離線儲存刪除記錄](#feature-store-delete-records-offline-store)

## 從線上儲存刪除記錄
<a name="feature-store-delete-records-online-store"></a>

您可以使用 `DeletionMode` 要求參數來指定 `SoftDelete` (預設) 或 `HardDelete`，以便使用 `DeleteRecord` API 從線上儲存中軟刪除或實硬刪除記錄。如需 `DeleteRecord` API 的詳細資訊，請參閱 Amazon SageMaker API 參考中的 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_feature_store_DeleteRecord.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_feature_store_DeleteRecord.html)。

使用線上儲存：
+ 當您軟刪除 (預設) 時，GetRecord 或 BatchGetRecord 無法再擷取記錄，且除了 `RecordIdentifer` 和 `EventTime` 特徵值以外，特徵欄值會設定為 `null`。
+ 當您硬刪除時，記錄會從線上儲存中完全移除。

在這兩種情況下，特徵商店都會將已刪除的記錄標記附加至 `OfflineStore`。刪除的記錄標記是與原始記錄 `RecordIdentifer` 相同的記錄，但 `is_deleted` 值設定為 `True`，`EventTime` 設定為刪除輸入 `EventTime`，其他特徵值設定為 `null`。

請注意，在 `DeleteRecord` 中指定的 `EventTime` 應設定晚於相同 `RecordIdentifer` 的 `OnlineStore` 記錄中的現有記錄的 `EventTime`。如果不這樣設定，則不會發生刪除：
+ 對於 `SoftDelete`，現有 (未刪除) 記錄會保留在 `OnlineStore` 中，不過刪除記錄標記仍會寫入 `OfflineStore`。
+ `HardDelete` 返回 `EventTime`：`400 ValidationException` 表示刪除操作失敗。不會將刪除記錄標記寫入 `OfflineStore`。

下列範例會使用適用於 Python 的 SDK (Boto3) [https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker-featurestore-runtime/client/delete_record.html#delete-record](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker-featurestore-runtime/client/delete_record.html#delete-record) 操作來刪除特徵群組中的記錄。若要從特徵群組中刪除記錄，您將需要：
+ 特徵群組名稱 (`feature-group-name`)
+ 記錄標識符值作為字串 (`record-identifier-value`)
+ 刪除事件時間 (`deletion-event-time`)

  刪除事件時間應晚於您要刪除的記錄的事件時間。

### 線上儲存軟刪除範例
<a name="feature-store-delete-records-online-store-soft-delete"></a>

對於軟刪除，您將需要使用 `DeleteRecord` API，並且可以使用預設 `DeletionMode` 或將 `DeletionMode` 設定為 `SoftDelete`。

```
import boto3
client = boto3.client('sagemaker-featurestore-runtime')

client.delete_record(
    FeatureGroupName='feature-group-name',
    RecordIdentifierValueAsString='record-identifier-value',
    EventTime='deletion-event-time',
    TargetStores=[
        'OnlineStore',
    ],
    DeletionMode='SoftDelete'
)
```

### 線上儲存硬刪除範例
<a name="feature-store-delete-records-online-store-hard-delete"></a>

對於硬刪除，您需要使用 `DeleteRecord` API 並將 `DeletionMode` 設定為 `HardDelete`。

```
import boto3
client = boto3.client('sagemaker-featurestore-runtime')

client.delete_record(
    FeatureGroupName='feature-group-name',
    RecordIdentifierValueAsString='record-identifier-value',
    EventTime='deletion-event-timestamp',
    TargetStores=[
        'OnlineStore',
    ],
    DeletionMode='HardDelete'
)
```

## 從離線儲存刪除記錄
<a name="feature-store-delete-records-offline-store"></a>

您可以使用 Amazon SageMaker Feature Store，`OfflineStore` Iceberg 資料表格式軟刪除和硬刪除記錄。使用 `OfflineStore` Iceberg 資料表格式：
+ 當您軟刪除記錄時，Iceberg 資料表檔案的最新版本將不包含該記錄，但以前的版本仍將包含該記錄，並且可以使用時間歷程存取。如需時間歷程的相關資訊，請參閱 Athena 使用者指南中的[查詢 Iceberg 資料表資料和執行時間歷程](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-table-data.html)。
+ 當您硬刪除記錄時，您將刪除包含該記錄的先前版本的 Iceberg 資料表。在這種情況下，您應該指定要刪除的 Iceberg 資料表的版本。

### 取得您的 Iceberg 資料表名稱
<a name="feature-store-delete-records-offline-store-get-iceberg-table-name"></a>

要從 `OfflineStore` Iceberg 資料表中軟刪除，您需要取得您的 Iceberg 資料表名稱 `iceberg-table-name`。以下指示假設您已使用 Feature Store，使用 Iceberg 資料表格式 `DisableGlueTableCreation = False` (預設) 透過離線儲存儲存組態來建立特徵群組。如需建立特徵群組的詳細資訊，請參閱[開始使用 Amazon SageMaker Feature Store](feature-store-getting-started.md)。

若要取得您的 `iceberg-table-name`，請使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeFeatureGroup.html.title](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeFeatureGroup.html.title) API 來取得 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DataCatalogConfig.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DataCatalogConfig.html)。這包含 Glue 資料表的中繼資料，作為 `OfflineStore` 的資料型錄。`DataCatalogConfig` 中的 `TableName` 是您的 `iceberg-table-name`。

### Amazon Athena 離線儲存軟刪除和硬刪除範例
<a name="feature-store-delete-records-offline-store-athena"></a>

以下指示如何使用 Amazon Athena 進行軟刪除，然後從 `OfflineStore` Iceberg 資料表中硬刪除記錄。這假設您要在 `OfflineStore` 中刪除的記錄是已刪除的記錄標記。如需有關 `OfflineStore` 中已刪除記錄標記的資訊，請參閱[從線上儲存刪除記錄](#feature-store-delete-records-online-store)。

1. 取得您的 Iceberg 資料表名稱 `iceberg-table-name`。如需如何取得 Iceberg 資料表名稱的相關資訊，請參閱[取得您的 Iceberg 資料表名稱](#feature-store-delete-records-offline-store-get-iceberg-table-name)。

1. 執行 `DELETE` 指令以軟刪除 `OfflineStore` 上的記錄，以便 Iceberg 資料表的最新版本 (或快照) 不會包含記錄。下列範例會刪除其中 `is_deleted` 為 `'True'` 的記錄，以及這些記錄的先前事件時間版本。您可以根據其他特徵新增其他條件來限制刪除。如需有關透過 Athena 使用 `DELETE` 的詳細資訊，請參閱 Athena 使用者指南中的 `DELETE`。

   ```
   DELETE FROM iceberg-table-name WHERE record-id-feature-name IS IN ( SELECT record-id-feature-name FROM iceberg-table-name WHERE is_deleted = 'True')
   ```

   軟刪除的記錄仍然可以透過執行歷程在以前的檔案版本中檢視。如需執行時間歷程的相關資訊，請參閱 Athena 使用者指南中的[查詢 Iceberg 資料表資料和執行時間歷程](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-table-data.html)。

1. 從以前版本的 Iceberg 資料表中刪除記錄以便從 `OfflineStore` 中硬刪除記錄：

   1. 執行 `OPTIMIZE` 指令，根據相關 delete 檔案的大小和數量，將資料檔案重寫成更好的版面配置。如需有關最佳化 Iceberg 資料表和語法的詳細資訊，請參閱 Athena 使用者指南中的[最佳化處理 Iceberg 資料表](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-data-optimization.html)。

      ```
      OPTIMIZE iceberg-table-name REWRITE DATA USING BIN_PACK
      ```

   1. (可選，只需執行一次) 執行 `ALTER TABLE` 指令以變更 Iceberg 資料表設定值，並根據您的規格設定何時硬刪除以前的檔案版本。這可以透過將值指派給 `vacuum_min_snapshots_to_keep` 和 `vacuum_max_snapshot_age_seconds` 屬性來完成。如需有關變更 Iceberg 資料表集屬性的詳細資訊，請參閱 Athena 使用者指南中的 [ALTER TABLE SET PROPERTIES](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-managing-tables.html#querying-iceberg-alter-table-set-properties)。如需有關 Iceberg 資料表屬性鍵值對的詳細資訊，請參閱 Athena 使用者指南中的[資料表屬性](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-creating-tables.html#querying-iceberg-table-properties)。

      ```
      ALTER TABLE iceberg-table-name SET TBLPROPERTIES (
        'vacuum_min_snapshots_to_keep'='your-specified-value',
        'vacuum_max_snapshot_age_seconds'='your-specified-value'
      )
      ```

   1. 執行 `VACUUM` 指令以刪除 Iceberg 資料表中不再需要的資料檔案，而不是當前版本引用的資料檔案。`VACUUM` 指令應在當前快照中不再引用已删除的記錄後執行。例如，刪除之後執行 `vacuum_max_snapshot_age_seconds`。如需有關 `VACUUM` 與 Athena 和語法的詳細資訊，請參閱 [https://docs.aws.amazon.com/athena/latest/ug/vacuum-statement.html](https://docs.aws.amazon.com/athena/latest/ug/vacuum-statement.html)。

      ```
      VACUUM iceberg-table-name
      ```

### Apache Spark 離線儲存軟刪除和硬刪除範例
<a name="feature-store-delete-records-offline-store-spark"></a>

使用 Apache Spark 從 `OfflineStore` 中軟刪除記錄，然後再硬刪除記錄，您可以按照如上 [Amazon Athena 離線儲存軟刪除和硬刪除範例](#feature-store-delete-records-offline-store-athena) 中的相同指示操作，但請使用 Spark 程序。如需程序的完整清單，請參閱 Apache Iceberg 文件中的 [Spark 程序](https://iceberg.apache.org/docs/1.3.1/spark-procedures/)。
+ 從 `OfflineStore` 進行軟刪除：不使用 Athena 中的 `DELETE` 指令，而應使用 Apache Spark 中的 [https://iceberg.apache.org/docs/latest/spark-writes/#delete-from](https://iceberg.apache.org/docs/latest/spark-writes/#delete-from) 指令。
+ 從以前版本的 Iceberg 資料表中刪除記錄以便從 `OfflineStore` 中硬刪除記錄：
  + 變更您的 Iceberg 資料表組態時：請勿使用 Athena 的 `ALTER TABLE` 指令，而應使用 [https://iceberg.apache.org/docs/1.3.1/spark-procedures/#expire_snapshots](https://iceberg.apache.org/docs/1.3.1/spark-procedures/#expire_snapshots) 程序。
  + 若要從您的 Iceberg 資料表移除不再需要的資料檔案：請勿使用 Athena 中的 `VACUUM` 指令，而應使用 [https://iceberg.apache.org/docs/1.3.1/spark-procedures/#remove_orphan_files](https://iceberg.apache.org/docs/1.3.1/spark-procedures/#remove_orphan_files) 程序。