使用特征视图¶
备注
Snowflake 特征平台 API 在 Snowpark ML Python 包 (snowflake-ml-python
) v1.5.0 及更高版本中提供。
特征视图 将原始数据转换封装到一个或多个相关 特征 中。特征视图中的所有特征均按相同的计划刷新。特征平台由存储特征的 特征表 提供支持。
Snowflake 特征平台支持两种不同类型的特征视图:
Snowflake 管理的特征视图:特征表由 Snowflake 按照您指定的计划从原始数据自动刷新。如果您提供了刷新特征视图的计划,则将该特征视图视为 Snowflake 管理的视图。
外部特征视图:如果您不提供用于刷新特征视图的计划,则将其视为外部视图。您负责维护特征表,按需从原始数据更新特征,例如使用 dbt (https://www.getdbt.com/) 等工具。
snowflake.ml.feature_store.FeatureView
类是用于与特征视图交互的 Python API。FeatureView
构造函数接受包含特征生成逻辑的 Snowpark DataFrame。所提供的 DataFrame 还必须包含在与特征视图关联的实体中指定的 join_keys
列。如果特征视图包含时序特征,则需要时间戳列名称。
有关 Python API 的完整详细信息,请参阅 特征平台 API 参考。
创建 Snowflake 管理的特征视图¶
Snowflake 管理的特征视图使用 动态表 作为特征表。特征按照您指定的计划从源数据中提取,以高效、增量的方式处理新数据。下图展示了数据从其源通过特征转换进入特征表的流程。

要创建 Snowflake 管理的特征视图,请使用类似以下 Python 块的代码,其中 entity
是与特征关联的 实体,my_df
是包含基于源数据的特征转换逻辑的 Snowpark DataFrame。
设置 refresh_freq
参数可将特征视图指定为由 Snowflake 管理。该值可以是时间增量(最小值 1 minute
),也可以是带有时区的 cron
表达式(例如 * * * * * America/Los_Angeles
)。
from snowflake.ml.feature_store import FeatureView
managed_fv = FeatureView(
name="MY_MANAGED_FV",
entities=[entity],
feature_df=my_df, # Snowpark DataFrame containing feature transformations
timestamp_col="ts", # optional timestamp column name in the dataframe
refresh_freq="5 minutes", # how often feature data refreshes
desc="my managed feature view" # optional description
)
您可以使用 Snowpark Python 或在 SQL 中编写特征转换。Snowpark Python API 提供了用于定义常见特征类型(如窗口聚合)的 实用程序函数。有关使用这些函数的示例,请参阅 常见特征和查询模式。
要符合增量刷新的条件,每个源表都必须 启用变更跟踪。如果源表上尚未启用变更跟踪,Snowflake 会在创建特征视图的动态表时尝试自动启用此功能。这需要表的 OWNERSHIP。如果您不拥有该表,请让所有者启用变更跟踪,或使用 refresh_mode='FULL'
创建特征视图,它将在每次刷新时完全读取源表。
创建外部特征视图¶
对于在 Snowflake 特征平台之外生成的特征,可以通过在创建特征时将 refresh_freq
参数设置为 None
来注册它们。在这种情况下,您必须自行创建和维护特征表。特征 DataFrame 基于特征表,而非原始数据源,并且通常包含来自该表的简单投影,而未转换。
备注
您 可以 在特征 DataFrame 中执行特征转换;从特征视图中检索数据时,系统会根据需要执行这些计算。但是,外部特征视图的主要目的是配合已用于执行特征转换的工具(如 dbt (https://www.getdbt.com/))使用。通常,如果希望 Snowflake 执行特征转换,则应使用 Snowflake 管理的特征视图。
下图展示了数据从源开始,通过外部工具(此处为 dbt)执行特征转换,最终进入特征表的流程。

外部特征视图是作为特征表上的 视图 实现的,因此不会产生额外的存储成本。
下方代码展示了如何创建外部特征视图。
external_fv = FeatureView(
name="MY_EXTERNAL_FV",
entities=[entity],
feature_df=my_df, # Snowpark DataFrame referencing the feature table
timestamp_col="ts", # optional timestamp column name in the dataframe
refresh_freq=None, # None means the feature view is external
desc="my external feature view" # optional description
)
让特征视图更易被发现¶
将每个特征的描述添加到 FeatureView
中,这样就能更轻松地使用 Snowsight Universal Search 查找特征。 下面的示例使用特征视图的 attach_feature_desc
方法来提供 Python 字典中所包含的每个特征的简短描述:
external_fv = external_fv.attach_feature_desc(
{
"SENDERID": "Sender account ID for the transaction",
"RECEIVERID": "Receiver account ID for the transaction",
"IBAN": "International Bank Identifier for the receiver bank",
"AMOUNT": "Amount of the transaction"
}
)
这两种特征视图都可以用特征描述来充实。
注册特征视图¶
完全定义特征视图后,您可以使用特征平台的 register_feature_view
方法,通过自定义名称和版本在特征平台中注册该特征视图。增量维护(针对受支持的查询类型)和自动刷新基于指定的刷新频率执行。
在所提供的查询无法通过使用动态表的增量维护进行维护时,表将按照指定频率从查询中完全刷新。这可能会导致更大的特征刷新延迟和更高的维护成本。您可以更改查询逻辑,将查询分解为多个支持增量维护的较小查询,或者为动态表维护预置更大的虚拟仓库。 有关动态表限制的最新信息,请参阅 一般限制。
registered_fv: FeatureView = fs.register_feature_view(
feature_view=managed_fv, # feature view created above, could also use external_fv
version="1",
block=True, # whether function call blocks until initial data is available
overwrite=False, # whether to replace existing feature view with same name/version
)
特征视图管道定义在注册后不可变,只要特征视图存在,就可以提供一致的特征计算。
检索特征视图¶
在特征平台中注册特征视图后,您可以在需要时使用特征平台的 get_feature_view
方法从特征平台中检索该特征视图:
retrieved_fv: FeatureView = fs.get_feature_view(
name="MY_MANAGED_FV",
version="1"
)
发现特征视图¶
您可以使用 list_feature_views
方法,列出特征平台中所有已注册的特征视图,还可以选择按实体名称或特征视图名称进行筛选。有关匹配特征的信息将作为 Snowpark DataFrame 返回。下面的代码显示了获取特征视图列表的示例;fs
是对特征平台的引用。
fs.list_feature_views(
entity_name="<entity_name>", # optional
feature_view_name="<feature_view_name>", # optional
).show()
此外,还可以使用 Snowsight 特征平台 UI 或 Universal Search 来发现特征。
更新特征视图¶
可以使用特征平台的 update_feature_view
方法,更新已在特征平台中注册的特征视图的某些属性。可更新的属性包括:
特征视图的刷新频率
执行特征转换的仓库
特征视图的描述
不能修改特征定义和列。要更改特征平台中的特征,请创建新版本的特征视图。
调用 update_feature_view
时,通过提供特征视图的名称和版本来指定要更新的特征视图版本。附加参数指定要更新的属性;您可以只指定要更改的属性。下面的代码显示了更改特征视图属性的示例;:code:fs
是对特征平台的引用。
fs.update_feature_view(
name="<name>",
version="<version>",
refresh_freq="<new_fresh_freq>", # optional
warehouse="<new_warehouse>", # optional
desc="<new_description>", # optional
)
删除特征视图¶
可以使用特征平台的 delete_feature_view
方法从特征平台中删除特征视图。下面的代码显示了删除特征视图的示例;:code:fs
是对特征平台的引用。
fs.delete_feature_view(
feature_view="<name>",
version="<version>",
)
警告
删除特征视图版本会中断使用该版本的所有管线。在删除之前,请确保特征视图版本未在使用中。
成本注意事项¶
Snowflake 管理的特征视图使用 Snowflake 动态表。有关监控动态表的信息,请参阅 关于监控动态表;有关动态表成本的信息,请参阅 了解动态表的成本。外部特征视图使用视图,这不会产生额外存储成本。
已知限制¶
Snowflake 管理的特征视图的最大数量和特征视图中的特征转换查询受 动态表的限制 影响。
动态增量刷新并不支持所有的特征转换查询。查看限制。
特征视图名称是 SQL 标识符,并受 Snowflake 标识符要求 的约束。
特征视图版本为字符串,最大长度为 128 个字符。某些字符不允许使用,会生成错误消息。