Amazon SageMaker Python SDK v3.8.0 带来了三项面向 Feature Store 的更新,直击特征工程管线里最拖节奏的环节:数据治理审批慢、表格式切换成本高、离线/在线同步配置繁琐。下面逐项拆解,并给出可以直接跑的代码。
Lake Formation 治理集成:特征表不再"裸奔"
过去往 Feature Store 写特征组,数据权限基本靠手动在 S3 和 Glue 上配 IAM policy。团队大了之后,谁能读哪张特征表、谁能写哪个列,全靠人记,审批流程一卡就是半天。
v3.8.0 把 AWS Lake Formation 的细粒度访问控制直接接进了 Feature Store 的创建流程。创建特征组时可以声明受 Lake Formation 管辖,之后列级权限、行级过滤都走 Lake Formation 的统一授权模型,不再需要单独拼 IAM。
核心变化在 FeatureGroup 定义里多了一个治理模式参数:
import boto3
from sagemaker.feature_store.feature_group import FeatureGroup
sagemaker_session = boto3.Session().client("sagemaker")
fg = FeatureGroup(
name="user_purchase_stats",
sagemaker_session=sagemaker_session,
)
# 关键:启用 Lake Formation 治理
fg.create(
record_identifier_name="user_id",
event_time_name="event_time",
feature_definitions=[
{"FeatureName": "user_id", "FeatureType": "String"},
{"FeatureName": "event_time", "FeatureType": "String"},
{"FeatureName": "total_amount", "FeatureType": "Fractional"},
{"FeatureName": "order_count", "FeatureType": "Integral"},
],
online_store_config=False, # 仅离线,走 Lake Formation
offline_store_config={
"S3StorageConfig": {
"S3Uri": "s3://my-feature-bucket/user_purchase_stats/",
},
"EnableGlueTableCreation": True,
},
table_format="Iceberg", # 新能力之二,后面展开
governance_config={
"LakeFormationGovernance": "ENABLED",
},
)
启用后,在 Lake Formation 控制台里对 user_purchase_stats 表授权时,可以精确到列——比如只让推理服务读 total_amount 和 order_count,不让它看 user_id 原始值。这在金融和医疗场景下几乎是上线前置条件。
完整端到端 Notebook 在 SageMaker Python SDK 仓库的
examples/lake_formation_governance/目录下。
Iceberg 表格式:离线特征终于能增量更新
Feature Store 的离线存储之前默认用 Glue 的非分区 Parquet 表。问题很明显:每次特征回填或修正都要全量覆写,S3 上堆出一堆快照目录,下游 Spark/Athena 查询还得手动选最新版本。
v3.8.0 正式支持把离线特征组存为 Apache Iceberg 格式。Iceberg 自带快照隔离、时间旅行查询、行级 upsert,特征修正从"全量覆写"变成"增量 merge",管线耗时直接砍掉大半。
创建时只需指定 table_format="Iceberg"(上面代码已经用了),之后写入特征数据的方式不变:
import pandas as pd
from datetime import datetime
df = pd.DataFrame({
"user_id": ["u001", "u002", "u003"],
"event_time": [datetime.now().isoformat()] * 3,
"total_amount": [128.5, 45.0, 310.2],
"order_count": [5, 2, 12],
})
fg.ingest(data_frame=df, max_workers=3, max_processes=1)
但底层行为变了:Iceberg 写入会生成新快照而非新目录。下游用 Athena 查最新数据时,不再需要猜哪个路径是最新的:
-- Athena 查询 Iceberg 特征表,自动读最新快照
SELECT user_id, total_amount, order_count
FROM my_glue_database.user_purchase_stats
WHERE event_time > '2025-06-01'
如果需要回溯历史特征版本,Iceberg 的时间旅行查询一条 SQL 就搞定:
-- 查看某次训练时用的特征快照(指定 snapshot_id)
SELECT *
FROM my_glue_database.user_purchase_stats FOR SYSTEM_VERSION AS OF 123456789
WHERE user_id = 'u001'
对应的完整 Notebook 在 SDK 仓库的
examples/iceberg_table_properties/目录。
特征组属性配置更精细
第三项更新是离线特征组的 Iceberg 表属性(table properties)现在可以在创建时直接传入。比如控制压缩策略、快照保留数量、分区演化行为等,不再需要创建后再用 Glue API 或 Spark 去改。
offline_store_config = {
"S3StorageConfig": {
"S3Uri": "s3://my-feature-bucket/user_purchase_stats/",
},
"EnableGlueTableCreation": True,
"TableFormat": "Iceberg",
"IcebergTableConfig": {
# 写入优化:小文件合并阈值
"write.target-file-size-bytes": "134217728", # 128 MB
# 快照保留:只保留最近 5 个,避免元数据膨胀
"history.expire.max-snapshot-age-ms": "432000000",
"clean.orphan-files.min-retention-ms": "432000000",
},
}
这些属性直接影响 Iceberg 表的维护成本。特征管线高频写入时,如果不控快照数量,元数据文件会快速膨胀,Athena 和 Spark 的计划阶段越来越慢。提前在创建时设好,省掉后续运维踩坑。
上手清单
三项能力组合起来,特征管线的搭建思路可以这样调整:
| 环节 | 之前 | 现在 |
|---|---|---|
| 权限管理 | 手拼 IAM policy | Lake Formation 列级授权 |
| 特征修正 | 全量覆写 Parquet | Iceberg 行级 upsert |
| 版本回溯 | 手动找 S3 最新路径 | FOR SYSTEM_VERSION AS OF |
| 表属性调优 | 创建后手动改 | 创建时直接传 IcebergTableConfig |
落地时注意几点:
- Lake Formation 治理只支持离线存储。在线特征组(低延迟推理场景)目前不走 Lake Formation,权限仍靠 IAM。如果你的场景需要在线+离线同步,离线表加治理,在线表继续用 IAM,两套权限要分别维护。
- Iceberg 格式要求 Glue 4.0 以上。确认你的 Glue Catalog 版本兼容,否则 Athena 查询会报格式不支持。
- SDK 版本要 ≥ 3.8.0。升级命令:
pip install --upgrade sagemaker>=3.8.0
升级后跑一下 sagemaker.__version__ 确认。如果项目里锁了旧版 SDK,建议在独立环境里先验证再合并。
- 已有 Parquet 特征组不能原地切 Iceberg。需要新建特征组、迁移数据、切换下游查询指向。建议先在新特征组上跑通全流程,再逐步迁移旧表,不要一刀切。
这三项更新本质上是在补 Feature Store 的"基础设施短板"——治理和表格式是数据平台成熟之后绕不开的问题。如果你的特征管线还在用裸 Parquet + 手动 IAM,v3.8.0 是个值得花半天升级的节点。