

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

# 将 Feature Store 与 SDK for Python (Boto3) 结合使用
<a name="feature-store-create-feature-group"></a>

功能组是功能商店的主要资源，其中包含存储在亚马逊 SageMaker 功能商店中的机器学习 (ML) 数据和元数据。 要素组是要素和记录的逻辑分组。特征组的定义由其在线和离线存储的配置以及用于描述记录值的特征定义列表组成。特征定义必须包括记录标识符名称和事件时间名称。有关 Feature Store 概念的更多信息，请参阅 [Feature Store 概念](feature-store-concepts.md)。

使用 Feature Store 之前，您通常会加载数据集、运行转换并设置特征以供摄取。这个过程有很多变化，并且高度依赖于您的数据。以下主题中的示例代码分别参考[功能商店简介](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/feature_store_introduction.html)和[使用 Amazon F SageMaker eature Store 进行欺诈检测](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/sagemaker_featurestore_fraud_detection_python_sdk.html)示例笔记本。两者都使用 适用于 Python (Boto3) 的 AWS SDK。有关更多特征存放区示例和资源，请参阅 [Amazon SageMaker 功能商店资源](feature-store-resources.md)。

Feature Store 支持以下特征类型：`String`、`Fractional`（IEEE 64 位浮点值）和 `Integral`（Int64 - 64 位有符号整数值）。默认类型设置为 `String`。这意味着，如果数据集内的某列不是 `float` 或 `long` 特征类型，则该列在 Feature Store 中默认设置为 `String`。

您可以使用架构来描述数据的列和数据类型。您将此架构传递到 `FeatureDefinitions`，这是 `FeatureGroup` 的必需参数。您可以使用 SDK for Python (Boto3)，在使用 `load_feature_definitions` 函数时，该 SDK 可以自动检测数据类型。

添加一个具有已存在记录 ID 的新特征记录时的默认行为如下所示。在离线存储中，将附加新记录。在在线存储中，如果新记录的事件时间小于现有事件时间，则不会发生任何事情，但如果新记录的事件时间大于或等于现有事件时间，则该记录将被覆盖。

创建新特征组时，可以选择以下表格式之一：
+ AWS Glue （默认）
+ Apache Iceberg

摄取数据（尤其在流式处理时）可能会导致大量小文件存入离线存储。由于所需的文件操作次数较多，这可能会对查询性能产生负面影响。为避免潜在的性能问题，请在创建新特征组时使用 Apache Iceberg 表格式。使用 Iceberg 可以将分区中的小数据文件压缩成较少的大文件，从而显著加快查询速度。此压缩操作是并发的，不会影响特征组上正在进行的读取和写入操作。如果您在创建新功能组时选择 Iceberg 选项，Amazon SageMaker Feature Store 将使用 Parquet 文件格式创建 Iceberg 表，并将这些表注册到中。 AWS Glue Data Catalog

**重要**  
请注意，对于 Iceberg 表格式的特征组，必须指定 `String` 作为事件时间值。如果指定任何其他类型，则无法成功创建特征组。

在下文中，我们列出了一些可用的 Feature Store 托管资源。

**Topics**
+ [“Feature Store 简介”示例笔记本](feature-store-introduction-notebook.md)
+ [“使用 Feature Store 进行欺诈检测”示例笔记本](feature-store-fraud-detection-notebook.md)

# “Feature Store 简介”示例笔记本
<a name="feature-store-introduction-notebook"></a>

**重要**  
允许 Amazon SageMaker Studio 或 Amazon SageMaker Studio Classic 创建亚马逊 SageMaker资源的自定义 IAM 策略还必须授予向这些资源添加标签的权限。之所以需要为资源添加标签的权限，是因为 Studio 和 Studio Classic 会自动为创建的任何资源添加标签。如果 IAM 策略允许 Studio 和 Studio Classic 创建资源但不允许标记，则在尝试创建资源时可能会出现 AccessDenied “” 错误。有关更多信息，请参阅 [提供标记 A SageMaker I 资源的权限](security_iam_id-based-policy-examples.md#grant-tagging-permissions)。  
[AWS 亚马逊 A SageMaker I 的托管策略](security-iam-awsmanpol.md)授予创建 SageMaker 资源的权限已经包括在创建这些资源时添加标签的权限。

本页上的示例代码是指 [Feature Store 简介](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/feature_store_introduction.html)示例笔记本。我们建议您在 Studio Classic、笔记本实例中运行此笔记本，或者 JupyterLab 因为本指南中的代码是概念性的，如果复制，则无法完全正常运行。

使用以下内容克隆包含示例笔记本的 [aws/ amazon-sagemaker-examples](https://github.com/aws/amazon-sagemaker-examples) GitHub 存储库：
+ **对于 Studio Classic**

  启动 Studio Classic。如果将 Studio 或 Studio Classic 作为默认体验启用，则可以打开 Studio Classic。有关如何打开 Studio Classic 的说明，请参阅 [使用亚马逊 A SageMaker I 控制台启动 Amazon SageMaker Studio Classic](studio-launch.md#studio-launch-console)。

  按照中的步骤将 [aws/ amazon-sagemaker-examples](https://github.com/aws/amazon-sagemaker-examples) GitHub 存储库克隆到 Studio Classic。[在 Amazon SageMaker Studio 经典版中克隆 Git 存储库](studio-tasks-git.md)
+ **适用于 Amazon SageMaker 笔记本实例**

  按照中的说明启动 SageMaker 笔记本实例[访问笔记本实例](howitworks-access-ws.md)。

现在，您已拥有 SageMaker AI 示例笔记本，请导航到`amazon-sagemaker-examples/sagemaker-featurestore`目录并打开 Feature [Store 简介](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/feature_store_introduction.html)示例笔记本。

## 步骤 1：设置 SageMaker AI 会话
<a name="feature-store-setup"></a>

要开始使用功能存储，请创建 A SageMaker I 会话。然后，设置要用于功能的 Amazon Simple Storage Service (Amazon S3) 存储桶。Amazon S3 存储桶是您的离线存储。以下代码使用 SageMaker AI 默认存储桶并为其添加自定义前缀。

**注意**  
用于运行笔记本的角色必须附加以下托管策略：`AmazonS3FullAccess` 和 `AmazonSageMakerFeatureStoreAccess`。有关向 IAM 角色添加策略的信息，请参阅 [向您的 IAM 角色添加策略](feature-store-adding-policies.md)。

```
# SageMaker Python SDK version 2.x is required
import sagemaker
import sys
```

```
import boto3
import pandas as pd
import numpy as np
import io
from sagemaker.session import Session
from sagemaker import get_execution_role

prefix = 'sagemaker-featurestore-introduction'
role = get_execution_role()

sagemaker_session = sagemaker.Session()
region = sagemaker_session.boto_region_name
s3_bucket_name = sagemaker_session.default_bucket()
```

## 步骤 2：检查数据
<a name="feature-store-load-datasets"></a>

在这个笔记本示例中，我们从托管完整笔记本的[GitHub 存储库](https://github.com/aws/amazon-sagemaker-examples/tree/master/sagemaker-featurestore/data)中提取合成数据。

```
customer_data = pd.read_csv("data/feature_store_introduction_customer.csv")
orders_data = pd.read_csv("data/feature_store_introduction_orders.csv")

print(customer_data.head())
print(orders_data.head())
```

下图说明了数据在特征存放区摄取之前要经过的步骤。在本笔记本中，我们将举例说明从多个来源获取数据并希望将其独立存储在特征存放区中的使用场景。我们的示例考虑了来自数据仓库的数据（客户数据）和来自实时流式传输服务的数据（订单数据）。

![\[为本示例笔记本创建特征组并在特征存放区中进行数据摄取。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/feature-store/feature-store-intro-diagram.png)


## 步骤 3：创建特征组
<a name="feature-store-set-up-feature-groups-introduction"></a>

我们首先为 customer\$1data 和 orders\$1data 创建特征组名称。随后，我们创建了两个特征组，一个用于 `customer_data`，另一个用于 `orders_data`：

```
import time
from time import strftime, gmtime
customers_feature_group_name = 'customers-feature-group-' + strftime('%d-%H-%M-%S', gmtime())
orders_feature_group_name = 'orders-feature-group-' + strftime('%d-%H-%M-%S', gmtime())
```

为 `customers_data` 和 `orders_data` 实例化一个 `FeatureGroup` 对象：

```
from sagemaker.feature_store.feature_group import FeatureGroup

customers_feature_group = FeatureGroup(
    name=customers_feature_group_name, sagemaker_session=sagemaker_session
)
orders_feature_group = FeatureGroup(
    name=orders_feature_group_name, sagemaker_session=sagemaker_session
)
```

```
import time
current_time_sec = int(round(time.time()))
record_identifier_feature_name = "customer_id"
```

将 `EventTime` 特征附加到您的数据框。该参数为必填参数，用于为每个数据点打上时间戳：

```
customer_data["EventTime"] = pd.Series([current_time_sec]*len(customer_data), dtype="float64")
orders_data["EventTime"] = pd.Series([current_time_sec]*len(orders_data), dtype="float64")
```

将功能定义加载到特征组：

```
customers_feature_group.load_feature_definitions(data_frame=customer_data)
orders_feature_group.load_feature_definitions(data_frame=orders_data)
```

下面调用 `create` 分别创建两个特征组 `customers_feature_group` 和 `orders_feature_group`：

```
customers_feature_group.create(
    s3_uri=f"s3://{s3_bucket_name}/{prefix}",
    record_identifier_name=record_identifier_feature_name,
    event_time_feature_name="EventTime",
    role_arn=role,
    enable_online_store=True
)

orders_feature_group.create(
    s3_uri=f"s3://{s3_bucket_name}/{prefix}",
    record_identifier_name=record_identifier_feature_name,
    event_time_feature_name="EventTime",
    role_arn=role,
    enable_online_store=True
)
```

为了确认您的功能组已创建，我们使用`DescribeFeatureGroup`和进行显示 `ListFeatureGroups` APIs：

```
customers_feature_group.describe()
```

```
orders_feature_group.describe()
```

```
sagemaker_session.boto_session.client('sagemaker', region_name=region).list_feature_groups() # We use the boto client to list FeatureGroups
```

## 步骤 4：将数据摄取到特征组
<a name="feature-store-set-up-record-identifier-event-time"></a>

创建特征组后，我们就可以将数据放入特征组中。如果你使用的是 SageMaker AI 适用于 Python (Boto3) 的 AWS SDK，请使用 `ingest` API 调用。如果您使用的是 Python SDK (Boto3)，那么请使用 `PutRecord` API。应用程序接口。这两个选项都只需不到 1 分钟就能摄取数据。此示例使用适用于 Python 的 SageMaker AI SDK (Boto3)，因此它使用了 API 调用：`ingest`

```
def check_feature_group_status(feature_group):
    status = feature_group.describe().get("FeatureGroupStatus")
    while status == "Creating":
        print("Waiting for Feature Group to be Created")
        time.sleep(5)
        status = feature_group.describe().get("FeatureGroupStatus")
    print(f"FeatureGroup {feature_group.name} successfully created.")

check_feature_group_status(customers_feature_group)
check_feature_group_status(orders_feature_group)
```

```
customers_feature_group.ingest(
    data_frame=customer_data, max_workers=3, wait=True
)
```

```
orders_feature_group.ingest(
    data_frame=orders_data, max_workers=3, wait=True
)
```

我们使用任意的客户记录 ID 573291，利用 `get_record` 来检查数据是否已摄取到特征组中。

```
customer_id = 573291
sample_record = sagemaker_session.boto_session.client('sagemaker-featurestore-runtime', region_name=region).get_record(FeatureGroupName=customers_feature_group_name, RecordIdentifierValueAsString=str(customer_id))
```

```
print(sample_record)
```

下面演示了如何使用 `batch_get_record` 来获取一批记录。

```
all_records = sagemaker_session.boto_session.client(
    "sagemaker-featurestore-runtime", region_name=region
).batch_get_record(
    Identifiers=[
        {
            "FeatureGroupName": customers_feature_group_name,
            "RecordIdentifiersValueAsString": ["573291", "109382", "828400", "124013"],
        },
        {
            "FeatureGroupName": orders_feature_group_name,
            "RecordIdentifiersValueAsString": ["573291", "109382", "828400", "124013"],
        },
    ]
)
```

```
print(all_records)
```

## 第 5 步：清理
<a name="feature-store-load-feature-definitions"></a>

在此，我们将删除创建的特征组。

```
customers_feature_group.delete()
orders_feature_group.delete()
```

## 步骤 6：后续步骤
<a name="feature-store-setup-create-feature-group"></a>

在本示例笔记本中，您将学习如何开始使用特征存放区、创建特征组并将数据导入其中。

有关如何将特征存放区用于欺诈检测使用场景的高级示例，请参阅[使用特征存放区进行欺诈检测](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/sagemaker_featurestore_fraud_detection_python_sdk.html)。

## 步骤 7：为程序员提供代码示例
<a name="feature-store-working-with-feature-groups"></a>

在此笔记本中，我们使用了各种不同的 API 调用。它们中的大多数都可以通过 SageMaker Python SDK 访问，但有些仅存在于 Boto3 中。你可以直接在功能商店对象上调用 SageMaker Python SDK API 调用，而要调用 Boto3 中存在的 API 调用，则必须先通过 Boto3 和 SageMaker AI 会话访问 Boto3 客户端：例如，。`sagemaker_session.boto_session.client()`

以下是本笔记本的 API 调用列表。这些调用存在于 SDK for Python 中，也存在于 Boto3 中，供您参考：

 **SDK for Python (Boto3) API Calls** 

```
describe()
ingest()
delete()
create()
load_feature_definitions()
```

 **Boto3 API 调用** 

```
list_feature_groups()
get_record()
```

# “使用 Feature Store 进行欺诈检测”示例笔记本
<a name="feature-store-fraud-detection-notebook"></a>

**重要**  
允许 Amazon SageMaker Studio 或 Amazon SageMaker Studio Classic 创建亚马逊 SageMaker资源的自定义 IAM 策略还必须授予向这些资源添加标签的权限。之所以需要为资源添加标签的权限，是因为 Studio 和 Studio Classic 会自动为创建的任何资源添加标签。如果 IAM 策略允许 Studio 和 Studio Classic 创建资源但不允许标记，则在尝试创建资源时可能会出现 AccessDenied “” 错误。有关更多信息，请参阅 [提供标记 A SageMaker I 资源的权限](security_iam_id-based-policy-examples.md#grant-tagging-permissions)。  
[AWS 亚马逊 A SageMaker I 的托管策略](security-iam-awsmanpol.md)授予创建 SageMaker 资源的权限已经包括在创建这些资源时添加标签的权限。

本页上的示例代码引用笔记本示例：[使用 Amazon Feature Store SageMaker 进行欺诈检测](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/sagemaker_featurestore_fraud_detection_python_sdk.html)。我们建议您在 Studio Classic、笔记本实例或 JupyterLab 中运行本笔记本，因为本指南中的代码是概念性的，复制后无法完全发挥作用。

使用以下内容克隆包含示例笔记本的 [aws/ amazon-sagemaker-examples](https://github.com/aws/amazon-sagemaker-examples) GitHub 存储库。
+ **对于 Studio Classic**

  首次启动 Studio Classic。如果将 Studio 或 Studio Classic 作为默认体验启用，则可以打开 Studio Classic。要打开 Studio Classic，请参阅 [使用亚马逊 A SageMaker I 控制台启动 Amazon SageMaker Studio Classic](studio-launch.md#studio-launch-console)。

  按照中的步骤将 [aws/ amazon-sagemaker-examples](https://github.com/aws/amazon-sagemaker-examples) GitHub 存储库克隆到 Studio Classic。[在 Amazon SageMaker Studio 经典版中克隆 Git 存储库](studio-tasks-git.md)
+ **适用于 Amazon SageMaker 笔记本实例**

  首先按照中的说明启动 SageMaker 笔记本实例[访问笔记本实例](howitworks-access-ws.md)。

  然后，按照[向你的亚马逊 A SageMaker I 账户添加 Git 存储库](nbi-git-resource.md)中的说明操作。

现在，您已经有了 SageMaker 人工智能示例笔记本，请导航到`amazon-sagemaker-examples/sagemaker-featurestore`目录并打开使用 A [mazon Feature Store SageMaker 进行欺诈检测](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-featurestore/sagemaker_featurestore_fraud_detection_python_sdk.html)示例笔记本。

## 步骤 1：设置特征存放区会话
<a name="feature-store-setup"></a>

要开始使用功能存储，请创建 A SageMaker I 会话、Boto3 会话和功能存储会话。此外，还设置要用于特征的 Amazon S3 存储桶。这是您的离线存储。以下代码使用 SageMaker AI 默认存储桶并为其添加自定义前缀。

**注意**  
用于运行笔记本的角色必须附加以下托管策略：`AmazonSageMakerFullAccess` 和 `AmazonSageMakerFeatureStoreAccess`。有关向 IAM 角色添加策略的信息，请参阅 [向您的 IAM 角色添加策略](feature-store-adding-policies.md)。

```
import boto3
import sagemaker
from sagemaker.session import Session

sagemaker_session = sagemaker.Session()
region = sagemaker_session.boto_region_name
boto_session = boto3.Session(region_name=region)
role = sagemaker.get_execution_role()
default_bucket = sagemaker_session.default_bucket()
prefix = 'sagemaker-featurestore'
offline_feature_store_bucket = 's3://{}/{}'.format(default_bucket, prefix)

sagemaker_client = boto_session.client(service_name='sagemaker', region_name=region)
featurestore_runtime = boto_session.client(service_name='sagemaker-featurestore-runtime', region_name=region)

feature_store_session = Session(
    boto_session=boto_session,
    sagemaker_client=sagemaker_client,
    sagemaker_featurestore_runtime_client=featurestore_runtime
)
```

## 步骤 2：加载数据集并将数据分区到特征组中
<a name="feature-store-load-datasets"></a>

将数据加载到每个特征的数据框中。设置特征组后，即可使用这些数据框。在欺诈检测示例中，您可以在以下代码中看到这些步骤。

```
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import io

s3_client = boto3.client(service_name='s3', region_name=region)

fraud_detection_bucket_name = 'sagemaker-featurestore-fraud-detection'
identity_file_key = 'sampled_identity.csv'
transaction_file_key = 'sampled_transactions.csv'

identity_data_object = s3_client.get_object(Bucket=fraud_detection_bucket_name, Key=identity_file_key)
transaction_data_object = s3_client.get_object(Bucket=fraud_detection_bucket_name, Key=transaction_file_key)

identity_data = pd.read_csv(io.BytesIO(identity_data_object['Body'].read()))
transaction_data = pd.read_csv(io.BytesIO(transaction_data_object['Body'].read()))

identity_data = identity_data.round(5)
transaction_data = transaction_data.round(5)

identity_data = identity_data.fillna(0)
transaction_data = transaction_data.fillna(0)

# Feature transformations for this dataset are applied before ingestion into FeatureStore.
# One hot encode card4, card6
encoded_card_bank = pd.get_dummies(transaction_data['card4'], prefix = 'card_bank')
encoded_card_type = pd.get_dummies(transaction_data['card6'], prefix = 'card_type')

transformed_transaction_data = pd.concat([transaction_data, encoded_card_type, encoded_card_bank], axis=1)
transformed_transaction_data = transformed_transaction_data.rename(columns={"card_bank_american express": "card_bank_american_express"})
```

## 步骤 3：设置特征组
<a name="feature-store-set-up-feature-groups-fraud-detection"></a>

设置特征组时，需要使用唯一名称自定义特征名称，并使用 `FeatureGroup` 类设置每个特征组。

```
from sagemaker.feature_store.feature_group import FeatureGroup
feature_group_name = "some string for a name"
feature_group = FeatureGroup(name=feature_group_name, sagemaker_session=feature_store_session)
```

例如，在欺诈检测示例中，两个特征组分别是 `identity` 和 `transaction`。在下面的代码中，您可以看到如何使用时间戳自定义名称，然后通过传入名称和会话来设置每个组。

```
import time
from time import gmtime, strftime, sleep
from sagemaker.feature_store.feature_group import FeatureGroup

identity_feature_group_name = 'identity-feature-group-' + strftime('%d-%H-%M-%S', gmtime())
transaction_feature_group_name = 'transaction-feature-group-' + strftime('%d-%H-%M-%S', gmtime())

identity_feature_group = FeatureGroup(name=identity_feature_group_name, sagemaker_session=feature_store_session)
transaction_feature_group = FeatureGroup(name=transaction_feature_group_name, sagemaker_session=feature_store_session)
```

## 步骤 4：设置记录标识符和事件时间特征
<a name="feature-store-set-up-record-identifier-event-time"></a>

在此步骤中，您将指定记录标识符名称和事件时间特征名称。该名称与数据中相应特征的列相对应。例如，在欺诈检测示例中，相关列是 `TransactionID`。当没有可用的时间戳时，可以将 `EventTime` 附加到您的数据中。在下面的代码中，您可以看到如何设置这些变量，然后将 `EventTime` 附加到两个特征的数据中。

```
record_identifier_name = "TransactionID"
event_time_feature_name = "EventTime"
current_time_sec = int(round(time.time()))
identity_data[event_time_feature_name] = pd.Series([current_time_sec]*len(identity_data), dtype="float64")
transformed_transaction_data[event_time_feature_name] = pd.Series([current_time_sec]*len(transaction_data), dtype="float64")
```

## 步骤 5：加载特征定义
<a name="feature-store-load-feature-definitions"></a>

现在，您可以通过传递包含特征数据的数据框来加载特征定义。在以下欺诈检测示例的代码中，身份特征和事务特征均通过使用 `load_feature_definitions` 加载，此函数会自动检测每列数据的数据类型。对于使用架构而非自动检测的开发人员，请参阅[从 Data Wrangler 导出特征组](https://docs.aws.amazon.com/sagemaker/latest/dg/data-wrangler-data-export.html#data-wrangler-data-export-feature-store)示例，其中的代码显示了如何加载架构、映射架构并将架构添加为 `FeatureDefinition` 以用于创建 `FeatureGroup`。此示例还介绍了一个 适用于 Python (Boto3) 的 AWS SDK 实现，你可以用它来代替 SageMaker Python SDK。

```
identity_feature_group.load_feature_definitions(data_frame=identity_data); # output is suppressed
transaction_feature_group.load_feature_definitions(data_frame=transformed_transaction_data); # output is suppressed
```

## 步骤 6：创建特征组
<a name="feature-store-setup-create-feature-group"></a>

在此步骤中，您使用 `create` 函数创建特征组。以下代码显示了所有可用的参数。默认情况下不会创建在线存储，因此如果要启用它，您必须将其设置为 `True`。`s3_uri` 是离线存储的 S3 存储桶位置。

```
# create a FeatureGroup
feature_group.create(
    description = "Some info about the feature group",
    feature_group_name = feature_group_name,
    record_identifier_name = record_identifier_name,
    event_time_feature_name = event_time_feature_name,
    feature_definitions = feature_definitions,
    role_arn = role,
    s3_uri = offline_feature_store_bucket,
    enable_online_store = True,
    online_store_kms_key_id = None,
    offline_store_kms_key_id = None,
    disable_glue_table_creation = False,
    data_catalog_config = None,
    tags = ["tag1","tag2"])
```

欺诈检测示例中的以下代码显示了为两个特征组中的每一个创建的最小 `create` 调用。

```
identity_feature_group.create(
    s3_uri=offline_feature_store_bucket,
    record_identifier_name=record_identifier_name,
    event_time_feature_name=event_time_feature_name,
    role_arn=role,
    enable_online_store=True
)

transaction_feature_group.create(
    s3_uri=offline_feature_store_bucket,
    record_identifier_name=record_identifier_name,
    event_time_feature_name=event_time_feature_name,
    role_arn=role,
    enable_online_store=True
)
```

创建特征组时，需要一些时间来加载数据，并且您需要等到特征组创建之后才能使用它。您可以使用以下方法来检查状态。

```
status = feature_group.describe().get("FeatureGroupStatus")
```

创建特征组时，您会收到 `Creating` 作为响应。成功完成此步骤后，响应为 `Created`。其他可能的状态是 `CreateFailed`、`Deleting` 或 `DeleteFailed`。

## 步骤 7：使用特征组
<a name="feature-store-working-with-feature-groups"></a>

现在，您已经设置了特征组，可以执行以下任何任务：

**Topics**
+ [描述特征组](#feature-store-describe-feature-groups)
+ [列出特征组。](#feature-store-list-feature-groups)
+ [将记录放入特征组。](#feature-store-put-records-feature-group)
+ [从特征组获取记录](#feature-store-get-records-feature-group)
+ [生成 Hive DDL 命令](#feature-store-generate-hive-ddl-commands-feature-group)
+ [构建训练数据集](#feature-store-build-training-dataset)
+ [编写和执行 Athena 查询](#feature-store-write-athena-query)
+ [删除特征组](#feature-store-delete-feature-group)

### 描述特征组
<a name="feature-store-describe-feature-groups"></a>

您可以使用 `describe` 函数检索有关特征组的信息。

```
feature_group.describe()
```

### 列出特征组。
<a name="feature-store-list-feature-groups"></a>

您可以使用 `list_feature_groups` 函数列出所有特征组。

```
sagemaker_client.list_feature_groups()
```

### 将记录放入特征组。
<a name="feature-store-put-records-feature-group"></a>

您可以使用 `ingest` 函数加载特征数据。您只需传入一个包含特征数据的数据框，设置工作线程数量，然后选择是否等待它返回即可。以下示例演示如何使用 `ingest` 函数。

```
feature_group.ingest(
    data_frame=feature_data, max_workers=3, wait=True
)
```

对于您拥有的每个特征组，对要加载的特征数据运行 `ingest` 函数。

### 从特征组获取记录
<a name="feature-store-get-records-feature-group"></a>

您可以使用 `get_record` 函数按记录标识符检索特定特征的数据。以下示例使用示例标识符来检索记录。

```
record_identifier_value = str(2990130)
featurestore_runtime.get_record(FeatureGroupName=transaction_feature_group_name, RecordIdentifierValueAsString=record_identifier_value)
```

欺诈检测示例的响应示例：

```
...
'Record': [{'FeatureName': 'TransactionID', 'ValueAsString': '2990130'},
  {'FeatureName': 'isFraud', 'ValueAsString': '0'},
  {'FeatureName': 'TransactionDT', 'ValueAsString': '152647'},
  {'FeatureName': 'TransactionAmt', 'ValueAsString': '75.0'},
  {'FeatureName': 'ProductCD', 'ValueAsString': 'H'},
  {'FeatureName': 'card1', 'ValueAsString': '4577'},
...
```

### 生成 Hive DDL 命令
<a name="feature-store-generate-hive-ddl-commands-feature-group"></a>

 SageMaker Python SDK 的`FeatureStore`类还提供了生成 Hive DDL 命令的功能。表的架构根据特征定义生成。列以特征名称命名，数据类型根据特征类型推断。

```
print(feature_group.as_hive_ddl())
```

输出示例：

```
CREATE EXTERNAL TABLE IF NOT EXISTS sagemaker_featurestore.identity-feature-group-27-19-33-00 (
  TransactionID INT
  id_01 FLOAT
  id_02 FLOAT
  id_03 FLOAT
  id_04 FLOAT
 ...
```

### 构建训练数据集
<a name="feature-store-build-training-dataset"></a>

Feature Store 会在您创建要素组时自动生成 AWS Glue 数据目录，您可以根据需要将其关闭。以下内容介绍了如何使用本主题前面创建的身份和事务特征组中的特征值创建单个训练数据集。此外，以下内容还介绍了如何运行 Amazon Athena 查询，以联接存储在离线存储中的身份和事务特征组数据。

首先，使用 `athena_query()` 为身份和事务特征组创建 Athena 查询。“table\$1name” 是功能商店自动生成的 AWS Glue 表。

```
identity_query = identity_feature_group.athena_query()
transaction_query = transaction_feature_group.athena_query()

identity_table = identity_query.table_name
transaction_table = transaction_query.table_name
```

### 编写和执行 Athena 查询
<a name="feature-store-write-athena-query"></a>

在这些特征组上使用 SQL 编写查询，然后使用 `.run()` 命令执行查询，并指定 Amazon S3 存储桶位置以便将数据集保存在那里。

```
# Athena query
query_string = 'SELECT * FROM "'+transaction_table+'" LEFT JOIN "'+identity_table+'" ON "'+transaction_table+'".transactionid = "'+identity_table+'".transactionid'

# run Athena query. The output is loaded to a Pandas dataframe.
dataset = pd.DataFrame()
identity_query.run(query_string=query_string, output_location='s3://'+default_s3_bucket_name+'/query_results/')
identity_query.wait()
dataset = identity_query.as_dataframe()
```

在这里，您可以使用此数据集训练模型，然后执行推理。

### 删除特征组
<a name="feature-store-delete-feature-group"></a>

您可以使用 `delete` 函数删除特征组。

```
feature_group.delete()
```

以下代码示例来自欺诈检测示例。

```
identity_feature_group.delete()
transaction_feature_group.delete()
```

更多信息，请参阅[删除特征组 API](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DeleteFeatureGroup.html)。