具体化功能视图

创建存储在 Unity 目录中的功能视图定义后,可以使用功能定义从源表生成特征数据。 此过程称为特征具体化。 Azure Databricks创建和管理 Lakeflow 管道,以填充 Unity 目录中的表,以便进行模型训练和批量评分或联机服务。

有关提供功能视图的信息,请参阅 服务功能视图。

要求

  • 必须将功能创建为功能视图,并存储在 Unity 目录中。

  • 关于版本要求,请参见 要求。

按特征类型划分的物质化支持

一个特征是否以及在哪里可以实现取决于其类型:

仅在在线存储中物化的特征在离线环境中仍可使用:create_training_set 和 compute_features 直接从源数据中计算其时间点值,因此无需进行离线物化。

ColumnSelection 具体化

ColumnSelection 功能为每个实体键选择单个列的最新值,而无需聚合。 它们只能具体化到在线商店。 对于脱机用例(训练和批处理推理), ColumnSelection 功能在查询时直接从源数据中提取,因此不需要脱机具体化。

具体化行为

  • 管道将每个实体键值的最新行写入在线表,没有聚合窗口。

  • 在线实例化将当前每个实体键的最新值填充到联机表中。

示例

from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
    DeltaTableSource, Feature, ColumnSelection, TableTrigger, OnlineStoreConfig,
)

fe = FeatureEngineeringClient()

delta_source = DeltaTableSource(
    catalog_name="catalog",
    schema_name="schema",
    table_name="transactions",
)

amount_feature = Feature(
    source=delta_source,
    function=ColumnSelection("amount"),
    entity=["user_id"],
    timeseries_column="transaction_time",
    name="latest_transaction_amount",
)

# Register before materializing
amount_feature = fe.register_feature(
    feature=amount_feature,
    catalog_name="catalog",
    schema_name="schema",
)

mfs = fe.materialize_features(
    features=[amount_feature],
    online_config=OnlineStoreConfig(
        catalog_name="catalog",
        schema_name="feats_online",
        table_name_prefix="txn_",
        online_store_name="lb_usw2"
    ),
    trigger=TableTrigger(),
)

每当源 Delta 表收到新提交时,ColumnSelection 功能使用 TableTrigger 来运行该管道。 不需要 offline_config ,因为 ColumnSelection 功能直接从源读取脱机用例(训练和批处理推理)。

注释

RequestSource 特征无法具体化,因为它们表示调用方在推理时提供的数据(或在训练时从标记的数据帧中提取)。 没有可读取的源表。 这些值仅存在于请求有效负载或训练数据帧中。

物化有新鲜度边界的最新值

带有 Last 的批处理RollingWindow聚合会为在线特征赋予生存时间(TTL):当没有任何源值落入该窗口时,其值会从在线存储中失效。 当某个值的存在时间决定是否可以安全地提供该值时,这会很有用。 例如,可以服务过去一小时的设备状态,而较旧的状态则解析为空状态,而非无限期保持可用。

A RollingWindow 定义了一个显式的持续时间,使该特征具有类似 TTL 的行为。 例如,如果源每天发布数值,而你只想保留过去七天的值,可以使用带有七天时长的 a RollingWindow 。 每次触发时,实体化都会对在线表执行一次完全替换,因此超出窗口范围的值会按照可预测的时间安排被移除。 这与带有 RollingWindow的流式传输Last结果相同,但成本更低,因为不连续运行计算。

这种发布模式类似于带有TTL的特征表,以快照模式发布。 如果你维护一套功能表,并希望将它们与其他功能视图一起使用,你可以将它们调整到功能视图创作框架中。 使用一个批处理RollingWindow,并带有TableTrigger和Last。

该组合具有一种特殊的仅限在线的具体化模式,要求如下:

  • 源必须是 DeltaTableSource。

  • 聚合函数必须是 Last,其窗口必须是 RollingWindow。

  • 具体化必须提供 OnlineStoreConfig,省略 OfflineStoreConfig,并使用 TableTrigger。

以下示例中, latest_device_state_1h 是一个符合以下要求的注册特征:

from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import OnlineStoreConfig, TableTrigger

fe = FeatureEngineeringClient()

materialized = fe.materialize_features(
    features=[latest_device_state_1h],
    online_config=OnlineStoreConfig(
        catalog_name="main",
        schema_name="feature_store",
        table_name_prefix="latest_device_state_serving",
        online_store_name="device_state_store",
    ),
    trigger=TableTrigger(),
)

对于离线训练和批量评分,特征工程客户端直接从源计算时间点值。 它不会读取此功能的离线物化结果。

Considerations

  • 到期时间仅会在触发时提前。 当源表提交触发物化刷新时,联机值及其到期时间都会提前。 时间本身不会触发刷新。 如果源停止发布数据,最后一次物化的值会保留在在线存储中,直到之后的某次提交触发刷新。

  • 将时间序列列与源发布时间对齐。 时间序列列必须反映数据来源发布数据的时间。 否则,在线值和离线值会出现偏差,因为在线存储是在触发时间进行关联,而离线读取是在时间序列时间进行关联。

  • 将窗口时长设置为发布节奏的倍数。 如果持续时间 RollingWindow 不是源发布节奏的整数倍,某些值在离线训练期间被视为过期,但在线上仍可见。

按需功能和物化

RequestSource 值来自训练数据框架或推理请求,因此没有源表可供实现。 FeatureViewSource 特征在训练或服务期间将A CustomUDF 应用到上游特征值。 它们不会存储预先计算的结果。 对于由 Delta 表支持的 CustomUDF 功能,也不支持物化。

对于一个依赖关系图,例如 revenue_sum_7d 和 cost_sum_7d 作为 margin 特性的输入:

  • 如需线下培训,请拨打 create_training_set 并使用 margin。 它会解析上游特征并计算时点值,并在可用时使用兼容的离线物化结果。

  • 对于在线服务,将支持的收入和成本功能转化为在线商店。 端点会查找它们,并为每个请求计算 margin。

  • 仅将受支持的上游功能传递给 materialize_features,不要传递给 margin,也不要传递任何基于请求的功能。 物质化不会递归地实现衍生特征的依赖关系。

仅使用请求支持功能的图表不需要在线商店。 参见 使用 FeatureViewSource 特征进行训练 和 提供派生特征。

Permissions

物质化需要对该功能以及源资源和目的资源拥有权限。 有关完整的 Unity 目录权限描述,请参见 Unity 目录权限参考。

  • 实现某项功能需要 MANAGE。 调用 materialize_features 负责创建和管理后台的 Lakeflow 管道和 Unity 目录表,因此这是一种管理操作。 你必须在特征上拥有 MANAGE 权限,以及读取被具体化的特征定义的 READ FEATURE 权限。

  • 删除实体化特征仅限于其创造者。 只有创建了实体化特征的用户才能使用 delete_materialized_feature 将其删除。 该限制与 Unity 目录权限无关: MANAGE 功能或其父模式不允许其他用户删除该功能。

  • 读取源数据需要 SELECT。 对于使用Delta表源的功能,你必须在源表上设置 SELECT 。 对于使用 Stream 源的功能,您必须在 Stream 的引入表上具有 SELECT。

    关于流认证配置所需的其他权限,请参见 Kafka 认证。

  • 创建目标表需要 CREATE TABLE。 你必须在由 OnlineStoreConfig 或 CREATE TABLE 指定的每个架构上都拥有 OfflineStoreConfig。 离线和在线目的地可能存在不同的模式或目录,实现需要对每个目的地拥有权限。

  • 实体化到在线商店需要 CAN USE。 你必须在在线商店使用的Lakebase实例或项目中拥有 CAN USE 。

  • 列出实体化功能需要在父功能上使用 READ FEATURE。 要使用 list_materialized_features,您必须在所实现的功能上拥有 READ FEATURE 。

  • 读取物化数据需要 SELECT。 你访问的每个离线或在线输出表上都必须具有 SELECT。 READ FEATURE 在父功能上不会授予访问这些表的权限。

对于参与实体化的每个 Unity Catalog 资源,你还需要在其父 Catalog 上具有 USE CATALOG 权限,并在其父架构上具有 USE SCHEMA 权限。 这一要求适用于该功能、每个源摄取表或 Stream 摄取表,以及每个已配置的目标位置。 在架构或目录上授予的 READ FEATURE 和 MANAGE 适用于其当前和未来包含的所有对象。

API 数据结构

OfflineStoreConfig

用于存储物化特征的离线存储配置。 当调用 materialize_features 时,特征存储后端使用此前缀创建表。 每次管道运行根据物化调度将最新特征值物化到表中。

OfflineStoreConfig(
    catalog_name: str,        # Catalog name for the offline table where materialized features will be stored
    schema_name: str,         # Schema name for the offline table
    table_name_prefix: str    # Table name prefix for the offline table. The pipeline may create multiple tables with this prefix, each updated at different cadences
)
from databricks.feature_engineering.entities import OfflineStoreConfig

offline_store = OfflineStoreConfig(
    catalog_name="main",
    schema_name="feature_store",
    table_name_prefix="customer_features"
)

OnlineStoreConfig

在线商店的配置,用于存储模型服务使用的功能。 物化生成catalog.schema.table_name_prefixDelta表,并将这些表流式传输到具有相同名称的在线特征库。

from databricks.feature_engineering.entities import OnlineStoreConfig

online_store = OnlineStoreConfig(
    catalog_name="main",
    schema_name="feature_store",
    table_name_prefix="customer_features_serving",
    online_store_name="customer_features_store"
)

MaterializedFeature

表示已物化的特征视图,即在 Unity Catalog 中具有可用的预计算表示。 离线表和在线表分别有独立的物化特征。 通常,你不会直接实例化 a MaterializedFeature 。

该 latest_backfill_operation 字段保存该物化特征最近一次回填的名称。

API 函数调用

materialize_features()

将特征视图列表物化到离线 Delta 表中,或写入在线特征存储。 在调用此函数之前,必须在 Unity 目录中注册功能(例如,使用 create_feature 或 register_feature)。 未注册的本地构造功能将不起作用。

FeatureEngineeringClient.materialize_features(
    *,                                                                     # Arguments are keyword-only
    features: List[Feature],                                               # List of Feature Views to materialize
    offline_config: Optional[OfflineStoreConfig] = None,                   # Offline store config (aggregation features only)
    online_config: Optional[OnlineStoreConfig] = None,                     # Online store config
    trigger: Union[CronSchedule, TableTrigger, StreamingMode],             # Materialization trigger
    tags: Optional[Dict[str, str]] = None,                                 # Custom tags for cost attribution
    budget_policy_id: Optional[str] = None,                                # Serverless usage policy for cost attribution
) -> List[MaterializedFeature]:

该方法返回具体化特征的列表,其中包含有关何时更新特征值的元数据,以及具体化功能的 Unity 目录表。

如果同时提供一个 OnlineStoreConfig 和一个 OfflineStoreConfig ,则为每个提供的功能返回两个具体化特征,每个类型的存储都有一个。

参数 trigger 控制材质化管道的运行时间:

  • CronSchedule:按源自该功能计时设置的计划运行,或者按调用方提供的 Quartz cron 计划运行。 支持批处理聚合功能(AggregationFunction 来自 DeltaTableSource)。

  • TableTrigger:当上游 Delta 表收到提交时运行。 支持 ColumnSelection 特征和聚合特征(AggregationFunction),由 DeltaTableSource. 对于聚合特征,流水线的运行频率会受到限制:最多每隔特征粒度的一半运行一次(对于滑动窗口,为滑动步长;对于翻转窗口,为窗口长度),上限为 1 小时,且频率不会高于每 5 分钟一次。 例如,最多每30分钟一次,达到1小时的细度;最多每小时一次,细度达到2小时或更长。 该间隔从上一次运行开始计时,因此即使某次提交在该间隔结束后才到达,仍会立即触发一次运行。

  • StreamingMode:以连续流式处理管道的方式运行。 功能需要 StreamSource 支持。

不能在单个 materialize_features 调用中混合需要不同触发器类型的功能。 改为发出单独的调用,而不是合并调用。

要归属物化的成本,请传入 tags、budget_policy_id 或两者。 Azure Databricks 会将这些信息应用于其创建的作业或管道,因此其支出会在可计费使用情况系统表中带有你的归因信息。 两者都是在创造时应用的,因此将现有的实体化归因不同,意味着创造新的实体。 budget_policy_id 取无服务器使用策略的ID。 要创建一个并获取其ID,请参见 创建无服务器使用策略。

具体化为脱机存储

from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
    CronSchedule, OfflineStoreConfig,
)

fe = FeatureEngineeringClient()

materialized = fe.materialize_features(
    features=features,
    offline_config=OfflineStoreConfig(
        catalog_name="main",
        schema_name="feature_store",
        table_name_prefix="customer_features"
    ),
    trigger=CronSchedule(
        quartz_cron_expression="0 0 * * * ?",  # Hourly
        timezone_id="UTC",
    ),
)

具体化到在线商店

注释

要将大部分聚合功能实现到线上商店,你也必须实现到线下商店。 offline_config 和 online_config 均为必需。 online_store_name必须引用现有的在线特征库。

ColumnSelection 功能不需要 OfflineStoreConfig. 请参阅 列选择物化。

RollingWindow这批带有Last特殊情况的内容也仅限线上。 参见 Materialize新鲜度受限的最新数值。

from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
    CronSchedule, OfflineStoreConfig, OnlineStoreConfig,
)

fe = FeatureEngineeringClient()

materialized = fe.materialize_features(
    features=features,
    offline_config=OfflineStoreConfig(
        catalog_name="main",
        schema_name="feature_store",
        table_name_prefix="customer_features"
    ),
    online_config=OnlineStoreConfig(
        catalog_name="main",
        schema_name="feature_store",
        table_name_prefix="customer_features_serving",
        online_store_name="customer_features_store"
    ),
    trigger=CronSchedule(
        quartz_cron_expression="0 0 * * * ?",  # Hourly
        timezone_id="UTC",
    ),
)

将流式特性实体化

流式处理功能只能具体化到在线商店;不支持参数 offline_config 。 不支持离线实体化,因为流式功能需要实时管道来确保亚秒级新鲜度。 对于脱机训练或评估,特征工程客户端将根据评估的每个数据点重新计算特征值。

流式特性不能在同一次 materialize_features 调用中与批处理特性混用。

from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
    OnlineStoreConfig, StreamingMode,
)

fe = FeatureEngineeringClient()

materialized = fe.materialize_features(
    features=[streaming_feature],
    online_config=OnlineStoreConfig(
        catalog_name="my_catalog",
        schema_name="my_schema",
        table_name_prefix="streaming_features_serving",
        online_store_name="feature_store_online"
    ),
    trigger=StreamingMode(),
)

list_materialized_features()

返回单个特征的具体化,由其全名标识。 feature_name 是必需参数,且仅限关键字指定。 若要查看多个特征的实体化,请先列出某个目录或架构中的特征,然后对返回的每个特征调用 list_materialized_features。

默认情况下,最多返回 100 个物化结果。 可以使用参数更改此限制 max_results 。

FeatureEngineeringClient.list_materialized_features(
    *,                                      # Arguments are keyword-only
    feature_name: str,                      # Required: full name of the feature whose materializations to list
    max_results: int = 100,                 # Maximum number of materializations to return
) -> List[MaterializedFeature]:

delete_materialized_feature()

在删除具体化功能之前,请删除或更新引用该功能的任何模型或功能规格。

删除已具体化的特性。 要传递的功能取决于功能类型:

  • 聚合特征:传递脱机物化特征。 如果同一功能存在联机具体化功能,则会删除两者。 对于具有 RollingWindow 的仅在线批处理 Last 特征,请传递在线物化特征。

  • ColumnSelection 特征:传递联机已生成的特征。 ColumnSelection 功能仅具体化到在线商店(请参阅 ColumnSelection 具体化),因此没有配对的脱机功能。

具体化过程中,功能按数据源和汇总时段进行组合,以提高效率。 ColumnSelection 功能没有聚合窗口,因此它们仅按数据源分组。 在删除所有分组特征之前,实体化管道、离线表和在线表都不会被删除。 当删除某个组中的最后一个实体化特征时,特征存储会将相关资源安排为由后台进程自动清理。 请参阅 后台资源清理。

若要清理具体化特征,请查看与具体化特征关联的表。 在清理计算和 Delta 表资源之前,必须删除表中的每个功能(每列一个)。

使用 list_materialized_features() 获取 materialized_feature 参数。

FeatureEngineeringClient.delete_materialized_feature(
    materialized_feature: MaterializedFeature,  # Required: The materialized feature to delete
) -> None
from databricks.feature_engineering import FeatureEngineeringClient

fe = FeatureEngineeringClient()

feature_names = [
    "main.feature_store.amount_sum_sliding_7d_1d",
    "main.feature_store.amount_sum_sliding_30d_1d",
    "main.feature_store.transaction_count_sliding_7d_1d",
    "main.feature_store.latest_transaction_amount",
    "main.feature_store.latest_user_tier",
]

for name in feature_names:
    mfs = fe.list_materialized_features(feature_name=name)   # required, keyword-only
    offline = [mf for mf in mfs if not mf.is_online]
    for mf in (offline or mfs):
        fe.delete_materialized_feature(materialized_feature=mf)
    fe.delete_feature(full_name=name)

后台资源清理

删除具体化功能时,Databricks 会立即删除功能元数据。 关联的基础结构(表、管道和作业)由后台进程异步清理。

由于多个具体化特征可以共享相同的表和管道,因此,只有在引用这些资源的所有具体化特征都已被删除后,这些共享资源才会被删除。 当共享一组表的最后一个物化特征被删除时,后台进程会自动删除以下资源:

  • 包含物化特征数据的离线 Delta 表
  • 联机表(如果功能已具体化到在线商店)
  • 物化管道
  • 编排作业

此后台进程使用由 Databricks 托管的系统服务主体,为你执行这些清理操作,包括删除工作区中的表、管道和作业。 你无需执行任何操作。 清理工作完全由特征存储管理。

注释

删除组中最后具体化功能以及删除关联的表和其他资源之间可能存在短暂的延迟。

局限性

批处理功能

  • 批量物化管道作为无服务器 Lakeflow 管道运行。

  • 批处理滚动窗口特征无法实体化,但在Last中描述的仅限在线的特殊情况除外。 对于离线训练或批量推断,系统会针对每个时间点查找请求,基于源数据计算滚动窗口特征。

  • ColumnSelection 功能只能具体化到在线商店。

  • RequestSource、FeatureViewSource和CustomUDF功能无法具体化。 参见 按需功能和实体化。

  • 具体化特征只能在生成它们的工作区中删除。

  • 只有创建实体化功能的用户可以删除该功能,无论该功能或其父模式的 Unity 目录权限如何。

  • 对于具体化聚合特征,无法直接删除联机具体化特征。 删除配对的脱机物化特征,更改将同步传播至两者。

  • 对于在 2026 年 4 月 20 日之前创建的具体化聚合特征,具体化管道将继续生成新的特征值,直到删除管道中的所有具体化特征,这会触发资源清理。 若要创建支持按功能删除的更新管道,请删除并重新具体化该功能。

  • 对于具体化特征的处理,具体化 ColumnSelection 管道会继续生成新的特征值,直到管道中的所有具体化特征被删除,这将触发资源清理。

流式功能

  • 流式处理功能只能具体化到在线商店。 不需要进行离线实体化,因为训练阶段使用的流式特征被设计为可根据每个数据点对应的历史事件重新计算,从而实现毫秒级精度。

  • 在单个 materialize_features 调用中,不能混合使用流式处理特性与批处理特性。

  • compute_features 不支持流式传输功能。

  • 工作区必须位于支持 Lakebase 实例的区域。

  • Kafka 消息可以使用 JSON、Avro 或 Protobuf。 关于模式要求和模式注册表的限制,请参见 模式注册表。

  • 仅支持将 RollingWindow 和 SawtoothWindow 用于流式聚合功能。 TumblingWindow 和 SlidingWindow 应与批处理功能一起使用。 请参见 流式功能的时间窗口。

  • 对于流式特征,仅支持 Count、Avg、Min、StddevPop、FirstDistinct、Sum、First、LastDistinct、Max、Last、FirstN 和 LastN 聚合函数。

  • 来自流式源的列选择功能无法处理乱序消息。 显示 Kafka 流的最新事件,即使时间列值早于以前收到的事件也是如此。

  • 流处理管道每周会重启两次。 每次重启可能会导致处理延迟和启动时间长达 1 分钟。 排除重启情况,p99 数据新鲜度为 200 毫秒。

  • 流媒体功能不能用 backfill_features 回填。 要向用于训练的流添加历史数据,可以在该流上配置回填源。

  • 在线商店中的一个 RollingWindow 功能只涵盖实体化开始后出现的事件,因此其数值只有在其完整的 window_duration 经过后才算完整。 SawtoothWindow特征在物化开始时,从流的摄入表中计算其历史值。 如果你后来在摄入表中更正数据,实体化并不会重新计算这些值。

  • 流式物化管道以无服务器 Lakeflow 管道的形式运行。