

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 从特征组中删除记录


您可以使用 Amazon F SageMaker eature Store API 从您的功能组中删除记录。特征组是一个包含机器学习 (ML) 数据的对象，其中数据列由特征描述，数据包含在记录中。一条记录包含与特定记录标识符关联的特征值。

特征组有两种存储配置：在线存储和离线存储。在线存储仅保留最新事件时间的记录，通常用于实时查找以进行机器学习推理。离线存储保留所有记录并充当历史数据库，通常用于特征探索、机器学习训练和批量推理。

有关 Feature Store 概念的更多信息，请参阅[摄取示意图](feature-store-concepts.md#feature-store-concepts-ingestion)。

有两种方法可以从特征组中删除记录，其行为因存储配置而异。在以下主题中，我们将介绍如何软删除和硬删除在线和离线存储中的记录，并提供示例。

**Topics**
+ [

## 从在线存储删除记录
](#feature-store-delete-records-online-store)
+ [

## 从离线存储删除记录
](#feature-store-delete-records-offline-store)

## 从在线存储删除记录


您可以使用 `DeletionMode` 请求参数指定 `SoftDelete`（默认）或 `HardDelete`，利用 `DeleteRecord` API 从在线存储软删除或硬删除记录。有关 `DeleteRecord` API 的更多信息，请参阅亚马逊 SageMaker API 参考[https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_feature_store_DeleteRecord.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_feature_store_DeleteRecord.html)中的。

通过在线存储：
+ 软删除（默认）时，将无法再通过 GetRecord 或检索记录， BatchGetRecord 并且要素列的值设置为`null`，但`RecordIdentifer`和要`EventTime`素值除外。
+ 硬删除记录后，将从在线存储中完全删除该记录。

在这两种情况下，Feature Store 都会将已删除的记录标记附加到 `OfflineStore`。已删除的记录标记是与原始记录具有相同 `RecordIdentifer` 的记录，但 `is_deleted` 值设置为 `True`，`EventTime` 设置为删除输入 `EventTime`，其他特征值设置为 `null`。

请注意，`DeleteRecord` 中指定的 `EventTime` 应设置为晚于同一 `RecordIdentifer` 在 `OnlineStore` 中现有记录的 `EventTime`。否则不会进行删除：
+ 对于 `SoftDelete`，现有（未删除）记录仍保留在 `OnlineStore` 中，但删除记录标记仍写入到 `OfflineStore`。
+ `HardDelete` 返回 `EventTime`: `400 ValidationException` 表示删除操作失败。没有向 `OfflineStore` 中写入任何删除记录标记。

以下示例使用 SDK for Python (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`)

  删除事件时间应晚于要删除的记录的事件时间。

### 在线存储软删除示例


要进行软删除，您需要使用 `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'
)
```

### 在线存储硬删除示例


要进行硬删除，您需要使用 `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 SageMaker mazon Feature Store，你可以软硬删除`OfflineStore`冰山表格式中的记录。使用 `OfflineStore` Iceberg 表格式：
+ 软删除记录时，最新版本的 Iceberg 表文件将不包含该记录，但以前的版本仍将包含该记录，并可使用时间旅行进行访问。有关时间旅行的信息，请参阅《Athena 用户指南》中的[查询 Iceberg 表数据并执行时间旅行](https://docs.amazonaws.cn/athena/latest/ug/querying-iceberg-table-data.html)。
+ 硬删除一条记录时，将删除包含该记录的 Iceberg 表的先前版本。在这种情况下，您应指定要删除哪些版本的 Iceberg 表。

### 获取 Iceberg 表名


要从 `OfflineStore` Iceberg 表进行软删除和硬删除，您需要获取 Iceberg 表名 `iceberg-table-name`。以下说明假设您已使用 Feature Store 创建了一个特征组，该特征组使用 Iceberg 表格式的离线存储配置，且 `DisableGlueTableCreation = False`（默认）。有关创建特征组的更多信息，请参阅[开始使用 Amazon Feature SageMaker Store](feature-store-getting-started.md)。

要获取 `iceberg-table-name`，请使用 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeFeatureGroup.html.title](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeFeatureGroup.html.title) API 获取 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DataCatalogConfig.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DataCatalogConfig.html)。这包含用作 `OfflineStore` 的数据目录的 Glue 表的元数据。`DataCatalogConfig` 中的 `TableName` 是您的 `iceberg-table-name`。

### Amazon Athena 离线存储软删除和硬删除示例


以下说明使用 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.amazonaws.cn/athena/latest/ug/querying-iceberg-table-data.html)。

1. 从先前版本的 Iceberg 表中删除记录，以便从 `OfflineStore` 硬删除该记录：

   1. 运行 `OPTIMIZE` 命令以根据数据文件的大小和相关删除文件的数量将数据文件重写为更优化的布局。有关优化 Iceberg 表和语法的更多信息，请参阅《Athena 用户指南》中的[优化 Iceberg 表](https://docs.amazonaws.cn/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.amazonaws.cn/athena/latest/ug/querying-iceberg-managing-tables.html#querying-iceberg-alter-table-set-properties)。有关 Iceberg 表属性键值对的更多信息，请参阅《Athena 用户指南》中的[表属性](https://docs.amazonaws.cn/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`。有关 Athena 的 `VACUUM` 和语法的更多信息，请参阅 [https://docs.amazonaws.cn/athena/latest/ug/vacuum-statement.html](https://docs.amazonaws.cn/athena/latest/ug/vacuum-statement.html)。

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

### Apache Spark 离线存储软删除和硬删除示例


要使用 Apache Spark 从 `OfflineStore` Iceberg 表软删除然后硬删除记录，可以按照与上述 [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) 过程。