使用特征视图

备注

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 特征平台中的托管特征视图

要创建 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
)
Copy

您可以使用 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)执行特征转换,最终进入特征表的流程。

Snowflake 特征平台中的托管特征视图

外部特征视图是作为特征表上的 视图 实现的,因此不会产生额外的存储成本。

下方代码展示了如何创建外部特征视图。

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
)
Copy

让特征视图更易被发现

将每个特征的描述添加到 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"
    }
)
Copy

这两种特征视图都可以用特征描述来充实。

注册特征视图

完全定义特征视图后,您可以使用特征平台的 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
)
Copy

特征视图管道定义在注册后不可变,只要特征视图存在,就可以提供一致的特征计算。

检索特征视图

在特征平台中注册特征视图后,您可以在需要时使用特征平台的 get_feature_view 方法从特征平台中检索该特征视图:

retrieved_fv: FeatureView = fs.get_feature_view(
    name="MY_MANAGED_FV",
    version="1"
)
Copy

发现特征视图

您可以使用 list_feature_views 方法,列出特征平台中所有已注册的特征视图,还可以选择按实体名称或特征视图名称进行筛选。有关匹配特征的信息将作为 Snowpark DataFrame 返回。下面的代码显示了获取特征视图列表的示例;fs 是对特征平台的引用。

fs.list_feature_views(
    entity_name="<entity_name>",                # optional
    feature_view_name="<feature_view_name>",    # optional
).show()
Copy

此外,还可以使用 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
)
Copy

删除特征视图

可以使用特征平台的 delete_feature_view 方法从特征平台中删除特征视图。下面的代码显示了删除特征视图的示例;:code:fs 是对特征平台的引用。

fs.delete_feature_view(
    feature_view="<name>",
    version="<version>",
)
Copy

警告

删除特征视图版本会中断使用该版本的所有管线。在删除之前,请确保特征视图版本未在使用中。

成本注意事项

Snowflake 管理的特征视图使用 Snowflake 动态表。有关监控动态表的信息,请参阅 关于监控动态表;有关动态表成本的信息,请参阅 了解动态表的成本。外部特征视图使用视图,这不会产生额外存储成本。

已知限制

  • Snowflake 管理的特征视图的最大数量和特征视图中的特征转换查询受 动态表的限制 影响。

  • 动态增量刷新并不支持所有的特征转换查询。查看限制

  • 特征视图名称是 SQL 标识符,并受 Snowflake 标识符要求 的约束。

  • 特征视图版本为字符串,最大长度为 128 个字符。某些字符不允许使用,会生成错误消息。

语言: 中文