Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Important
Este recurso está no Public Preview. Os administradores do espaço de trabalho podem controlar o acesso a esse recurso na página Visualizações . Ver Gerir as pré-visualizações de Azure Databricks.
Controlo de acesso
As funcionalidades são objetos governáveis do Catálogo Unity. O acesso a uma funcionalidade é controlado pelos CREATE FEATUREprivilégios de , READ FEATURE, e MANAGE do Catálogo Unity. Para descrições completas, consulte a referência de privilégios do Unity Catalog.
-
CREATE FEATURE— Necessário para criar uma funcionalidade num esquema.create_featureeregister_featureexigirCREATE FEATUREno esquema pai. Seguindo o princípio do privilégio mínimo, concedaCREATE FEATUREao nível do esquema; também pode concedê-lo num catálogo para permitir a criação de funcionalidades em qualquer esquema desse catálogo. -
READ FEATURE— Obrigado a ler uma característica e os seus dados.get_feature,create_training_set, e a leitura de dados materializados de funcionalidades para treino ou serviço necessárioREAD FEATUREsobre a funcionalidade.READ FEATUREconcedido num esquema ou catálogo aplica-se a todas as funcionalidades atuais e futuras que contém. -
MANAGE— Necessário para gerir o ciclo de vida e os subsídios de uma funcionalidade. Eliminar uma funcionalidade comdelete_feature, e materializar uma característica commaterialize_featuresoudelete_materialized_feature, requisitoMANAGEsobre a funcionalidade.
Todas as operações de funcionalidades também exigem USE CATALOG o catálogo pai e USE SCHEMA o esquema pai. Para saber como MANAGE e READ FEATURE aplicar à materialização, veja Permissões.
API de Visualização de Funcionalidades
Feature construtor e register_feature()
A abordagem recomendada é construir um Feature objeto localmente e usá-lo register_feature para persistir no Unity Catalog. Este fluxo de trabalho em dois passos permite-lhe experimentar funcionalidades (incluindo create_training_set) antes de as registar.
Feature(
source: DataSource, # Required: DeltaTableSource, StreamSource, or RequestSource
function: Union[AggregationFunction, ColumnSelection], # Required: Aggregation or column selection
entity: Optional[List[str]] = None, # Required for aggregation: entity columns
timeseries_column: Optional[str] = None, # Required for aggregation: timestamp column
name: Optional[str] = None, # Optional: Feature name (auto-generated if omitted)
description: Optional[str] = None, # Optional: Feature description
)
FeatureEngineeringClient.register_feature() regista um localmente construído Feature no Unity Catalog.
FeatureEngineeringClient.register_feature(
feature: Feature, # Required: A Feature instance (not already registered)
catalog_name: str, # Required: UC catalog name
schema_name: str, # Required: UC schema name
) -> Feature
from databricks.feature_engineering.entities import Feature, DeltaTableSource, AggregationFunction, Sum, RollingWindow
from datetime import timedelta
# Step 1: Construct the feature locally
feature = Feature(
source=DeltaTableSource(catalog_name="main", schema_name="store", table_name="transactions"),
entity=["user_id"],
timeseries_column="transaction_time",
function=AggregationFunction(Sum(input="amount"), RollingWindow(window_duration=timedelta(days=7))),
)
# Step 2: Register in Unity Catalog
fe = FeatureEngineeringClient()
registered_feature = fe.register_feature(
feature=feature,
catalog_name="main",
schema_name="store",
)
create_feature()
FeatureEngineeringClient.create_feature() valida, constrói e regista imediatamente uma funcionalidade no Unity Catalog num único passo. Usa isto quando não precisares de experimentar a funcionalidade localmente primeiro.
FeatureEngineeringClient.create_feature(
source: DataSource, # Required: DeltaTableSource, StreamSource, or RequestSource
function: Union[AggregationFunction, ColumnSelection], # Required: Aggregation or column selection
catalog_name: str, # Required: The catalog name for the feature
schema_name: str, # Required: The schema name for the feature
entity: Optional[List[str]] = None, # Required for aggregation: entity columns
timeseries_column: Optional[str] = None, # Required for aggregation: timestamp column
name: Optional[str] = None, # Optional: Feature name (auto-generated if omitted)
description: Optional[str] = None, # Optional: Feature description
) -> Feature
Parâmetros:
-
source: A fonte de dados usada no cálculo de características (DeltaTableSource,StreamSource, ouRequestSource). -
function: EAggregationFunctionque agrupa o operador (por exemplo,Sum(input="amount")), a coluna de entrada e a janela temporal. OuColumnSelection("column_name")para funcionalidades de passagem. -
catalog_name: O nome do catálogo do Catálogo Unity para a funcionalidade. -
schema_name: O nome do esquema do Catálogo Unity para a funcionalidade. -
entity: Lista de nomes de colunas que definem o nível de agregação (chaves primárias). Obrigatório para funcionalidades de agregação. Por exemplo,["user_id"]agregados por utilizador. -
timeseries_column: A coluna de carimbo temporal usada para agregação de janelas temporais. Obrigatório para funcionalidades de agregação. -
name: Nome opcional da funcionalidade. Se omitido, gerado automaticamente a partir da coluna de entrada, função e janela (por exemplo,amount_avg_rolling_7d). -
description: Descrição opcional da funcionalidade.
Retornos: Uma instância de Feature validada
Aumentos: ValueError se alguma validação falhar
delete_feature()
Apaga uma funcionalidade do Unity Catalog pelo seu nome totalmente qualificado.
FeatureEngineeringClient.delete_feature(
full_name: str, # Required: '<catalog>.<schema>.<feature_name>'
) -> None
fe.delete_feature(full_name="main.store.amount_sum_rolling_7d")
Antes de eliminar uma funcionalidade, remova ou atualize quaisquer modelos ou especificações que a referenciam. Se a funcionalidade já foi materializada, elimine-a primeiro. Veja Como eliminar uma funcionalidade materializada.
Nomes gerados automaticamente
Quando name é omitido, um nome é automaticamente gerado. Os nomes gerados seguem o padrão: {column}_{function}_{window}. Por exemplo:
-
price_avg_rolling_1h(Preço médio de 1 hora) -
transaction_count_rolling_30d_1d(Contagem de 30 dias de transação com atraso de 1d desde o carimbo temporal do evento)
Funções suportadas
Funções de agregação
Note
As funções de agregação são encapsuladas numa AggregationFunction juntamente com uma janela temporal, conforme descrito nas janelas temporais. Cada função utiliza um input parâmetro que especifica a coluna de origem a agregar.
| Function | Description | Exemplo de caso de uso |
|---|---|---|
Sum(input="column") |
Total de valores | Utilização diária da aplicação por utilizador em minutos |
Avg(input="column") |
Média dos valores | Montante médio da transação |
Count(input="column") |
Número de registos | Número de logins por utilizador |
Min(input="column") |
Valor mínimo | Frequência cardíaca mais baixa registada por um dispositivo vestível |
Max(input="column") |
Valor máximo | Maior valor de transação por sessão |
StddevPop(input="column") |
Desvio padrão da população | Variabilidade diária do montante das transações entre todos os clientes |
StddevSamp(input="column") |
Exemplo de desvio padrão | Variabilidade das taxas de cliques em campanhas publicitárias |
VarPop(input="column") |
Variância populacional | Distribuição das leituras de sensores para dispositivos IoT numa fábrica |
VarSamp(input="column") |
Variância da amostra | Distribuição das classificações de filmes por um grupo amostrado |
ApproxCountDistinct(input="column", relativeSD=0.05) |
Contagem única aproximada | Contagem distinta de itens comprados |
ApproxPercentile(input="column", percentile=0.95, accuracy=100) |
Percentil aproximado | Latência de resposta P95 |
First(input="column") |
Primeiro valor | Carimbo temporal do primeiro login |
Last(input="column") |
Último valor | Valor da compra mais recente |
ColumnSelection (passagem)
ColumnSelection seleciona uma única coluna de uma fonte sem aplicar qualquer agregação. Está envolto diretamente no function parâmetro (não dentro AggregationFunctionde ). O tipo de retorno é inferido a partir do esquema fonte.
| Function | Description | Exemplo de caso de uso |
|---|---|---|
ColumnSelection("col") |
Valor mais recente de uma coluna (sem agregação) | Categoria de fornecedor mais recente, passagem de um campo de pedido |
ColumnSelection pode ser usado com qualquer fonte de dados:
-
DeltaTableSource: Devolve o valor mais recente por chave de entidade através de uma junção em ponto no tempo (sem agregação de janela de retorno). -
StreamSource: Devolve o valor mais recente por chave de entidade do fluxo (sem agregação de janela de retorno). -
RequestSource: Passa pelo valor fornecido no momento da inferência (ou extraído do DataFrame rotulado no momento do treino).
from databricks.feature_engineering.entities import (
ColumnSelection, DeltaTableSource, Feature, FieldDefinition,
RequestSource, ScalarDataType,
)
delta_source = DeltaTableSource(
catalog_name="main", schema_name="feature_store", table_name="transactions",
)
request_source = RequestSource(
schema=[
FieldDefinition(name="session_duration", data_type=ScalarDataType.DOUBLE),
]
)
# ColumnSelection from a Delta table
latest_amount = Feature(
source=delta_source,
function=ColumnSelection("amount"),
entity=["user_id"],
timeseries_column="transaction_time",
name="latest_transaction_amount",
)
# ColumnSelection from a RequestSource
session_feature = Feature(
source=request_source,
function=ColumnSelection("session_duration"),
name="session_duration",
)
Exemplo: funcionalidades de agregação e seleção de colunas
O exemplo seguinte mostra características definidas sobre a mesma fonte de dados.
from databricks.feature_engineering.entities import (
AggregationFunction, Feature, Sum, Avg, ApproxCountDistinct,
ColumnSelection, RollingWindow,
)
from datetime import timedelta
window = RollingWindow(window_duration=timedelta(days=7))
sum_feature = Feature(
source=source,
entity=["user_id"],
timeseries_column="event_time",
function=AggregationFunction(Sum(input="amount"), window),
)
avg_feature = Feature(
source=source,
entity=["user_id"],
timeseries_column="event_time",
function=AggregationFunction(Avg(input="amount"), window),
)
distinct_count = Feature(
source=source,
entity=["user_id"],
timeseries_column="event_time",
function=AggregationFunction(ApproxCountDistinct(input="product_id", relativeSD=0.01), window),
)
# Column selection (no aggregation, no time window)
latest_amount = Feature(
source=source,
function=ColumnSelection("amount"),
entity=["user_id"],
timeseries_column="event_time",
name="latest_amount",
)
Funcionalidades com condições de filtro
O filter_condition parâmetro permite filtrar linhas da tabela de origem antes de calcular as agregações. Isto funciona como uma cláusula SQL WHERE que é aplicada antes de agrupar e agregar dados.
Note
filter_condition filtra linhas antes da agregação, como uma cláusula SQL WHERE aplicada antes GROUP BYde . Não altera a granularidade, que é sempre definida por entity na definição da característica.
Os filtros são úteis quando se trabalha com grandes tabelas de origem que incluem um superconjunto de dados necessários para o cálculo de características, e minimizam a necessidade de criar vistas separadas sobre essas tabelas.
from databricks.feature_engineering.entities import AggregationFunction, Sum, Count, RollingWindow, DeltaTableSource
from datetime import timedelta
# Source with filter applied at the source level
high_value_transactions = DeltaTableSource(
catalog_name="main",
schema_name="ecommerce",
table_name="transactions",
filter_condition="amount > 100", # Only transactions over $100
)
high_value_sales = Feature(
source=high_value_transactions,
entity=["user_id"],
timeseries_column="transaction_time",
function=AggregationFunction(Sum(input="amount"), RollingWindow(window_duration=timedelta(days=30))),
)
# Multiple conditions
completed_orders_source = DeltaTableSource(
catalog_name="main",
schema_name="ecommerce",
table_name="orders",
filter_condition="status = 'completed' AND payment_method = 'credit_card'",
)
completed_orders = Feature(
source=completed_orders_source,
entity=["user_id"],
timeseries_column="order_time",
function=AggregationFunction(Count(input="order_id"), RollingWindow(window_duration=timedelta(days=7))),
)
# Filter on a StreamSource
from databricks.feature_engineering.entities import StreamSource
purchase_stream = StreamSource(
full_name="main.ecommerce.transactions_stream",
filter_condition="value.event_type = 'purchase'",
)
purchase_total = Feature(
source=purchase_stream,
entity=["value.user_id"],
timeseries_column="value.event_time",
function=AggregationFunction(Sum(input="value.amount"), RollingWindow(window_duration=timedelta(hours=1))),
)
Fontes de dados
DeltaTableSource
DeltaTableSource é um objeto Python efémero usado para definir como as características são calculadas a partir de uma tabela fonte. Não cria uma nova tabela. Especifica a configuração para leitura de dados e agregação de características.
DeltaTableSource(
catalog_name: str, # Required: Catalog name
schema_name: str, # Required: Schema name
table_name: str, # Required: Table name
filter_condition: Optional[str] = None, # Optional: SQL WHERE clause to filter source data
transformation_sql: Optional[str] = None, # Optional: SQL SELECT expression for column transformations
dataframe_schema: Optional[str] = None, # Required if transformation_sql is set: schema of the resulting DataFrame
)
Parâmetros:
-
catalog_name,schema_name,table_name: Identifique a tabela Delta de origem no Unity Catalog. -
filter_condition: Uma cláusula SQLWHEREaplicada antes da agregação. Exemplo:"status = 'completed'". -
transformation_sql: Uma expressão SQLSELECTaplicada à tabela de origem. Use isto para renomear colunas, tipos de cast ou calcular colunas derivadas antes da agregação. Se omitido, todas as colunas são selecionadas (*). Exemplo:"user_id, CAST(amount AS DOUBLE) AS amount, event_time". -
dataframe_schema: O esquema do DataFrame resultante após transformações, no formato JSON Spark StructType (dedf.schema.json()). Necessário setransformation_sqlfor fornecido. Isto indica ao sistema os nomes das colunas e tipos que resultam da sua transformação.
Quando tanto filter_condition como transformation_sql estão definidos, a consulta resultante é: SELECT {transformation_sql} FROM {table} WHERE {filter_condition}.
Note
O timeseries_column (especificado na definição da característica, não em DeltaTableSource) deve ser do tipo TimestampType ou DateType. Os tipos inteiros podem funcionar, mas causam perda de precisão para agregados de janelas temporais.
Exemplo: Usar transformation_sql para transformações de coluna
source = DeltaTableSource(
catalog_name="main",
schema_name="analytics",
table_name="raw_events",
transformation_sql="user_id, CAST(price_cents AS DOUBLE) / 100 AS price, event_time",
filter_condition="event_type = 'purchase'",
dataframe_schema=spark.sql(
"SELECT user_id, CAST(price_cents AS DOUBLE) / 100 AS price, event_time FROM main.analytics.raw_events LIMIT 0"
).schema.json(),
)
Exemplo: derivar transformation_sql e dataframe_schema a partir de um DataFrame PySpark
Pode escrever a sua transformação como uma consulta PySpark e depois extrair o esquema do DataFrame resultante:
df = spark.sql(f"""
SELECT user_id, CAST(amount AS DOUBLE) / 100 AS amount_dollars, event_time
FROM main.analytics.events
WHERE event_date >= date_sub(current_date(), 7)
LIMIT 0
""")
# Use df.schema.json() as the dataframe_schema
source = DeltaTableSource(
catalog_name="main",
schema_name="analytics",
table_name="events",
transformation_sql="user_id, CAST(amount AS DOUBLE) / 100 AS amount_dollars, event_time",
filter_condition="event_date >= date_sub(current_date(), 7)",
dataframe_schema=df.schema.json(),
)
Note
transformation_sql suporta apenas expressões linha a linha (renomeação de colunas, casts, aritmética). Funções de agregação como COUNT(*) ou SUM() não são suportadas. Use AggregationFunction na definição de funcionalidades em vez disso.
DeltaTableSource.from_sql()
Por conveniência, pode criar um DeltaTableSource a partir de uma consulta SQL. O método analisa a consulta para extrair automaticamente o nome da tabela, transformation_sql, e filter_condition.
DeltaTableSource.from_sql(
sql: str, # Required: SQL SELECT query
spark: SparkSession, # Required: active SparkSession (for schema inference)
) -> DeltaTableSource
Apenas consultas simples SELECT ... FROM ... [WHERE ...] são suportadas. SQL complexo (JOINs, subconsultas, CTEs, UNIONs) é rejeitado. Para consultas complexas, constrói-se DeltaTableSource diretamente com transformation_sql e filter_condition.
from databricks.feature_engineering.entities import (
AggregationFunction,
DeltaTableSource,
Feature,
Sum,
TumblingWindow,
)
source = DeltaTableSource.from_sql(
spark=spark,
sql=f"SELECT customer_id, event_ts, amount * 2 AS doubled_amount, amount FROM {CATALOG}.{SCHEMA}.{TABLE}",
)
feature = Feature(
source=source,
function=AggregationFunction(Sum(input="doubled_amount"), time_window=TumblingWindow(window_duration=timedelta(days=7))),
entity=["customer_id"], timeseries_column="event_ts",
)
Iterar com to_dataframe()
Use source.to_dataframe() para pré-visualizar os dados que serão usados para o cálculo de características. Isto é útil para iterar sobre filter_condition e transformation_sql até que produzam os resultados esperados.
source = DeltaTableSource(
catalog_name="main",
schema_name="analytics",
table_name="events",
filter_condition="event_type = 'purchase'",
)
# Preview the filtered source data
source.to_dataframe().display()
Compreensão das entidades
As colunas de entidades definem o nível de agregação das suas funcionalidades. São especificados na Feature definição, não em DeltaTableSource. As entidades determinam:
-
Como os dados são agrupados: As funcionalidades são agregadas por combinação única de valores de entidade (semelhante ao
GROUP BYSQL) - A principal estrutura de chaves: Cada combinação única de entidades resulta numa linha de características computadas
Exemplo: Funcionalidades ao nível do cliente
O seguinte código agrega funcionalidades ao nível do cliente (uma linha por cliente):
from databricks.feature_engineering.entities import DeltaTableSource
source = DeltaTableSource(
catalog_name="main",
schema_name="analytics",
table_name="user_events",
)
Feature(
source=source,
entity=["user_id"], # Features aggregated per user
timeseries_column="event_time", # Timestamp for time windows
function=AggregationFunction(Sum(input="amount"), RollingWindow(window_duration=timedelta(days=7))),
)
Exemplo: Funcionalidades ao nível do cliente-loja
Para agregar funcionalidades a um nível mais detalhado (uma linha por combinação cliente-loja), use múltiplas colunas de entidade:
source = DeltaTableSource(
catalog_name="main",
schema_name="retail",
table_name="transactions",
)
Feature(
source=source,
entity=["user_id", "store_id"], # Features aggregated per user-store pair
timeseries_column="transaction_time",
function=AggregationFunction(Sum(input="amount"), RollingWindow(window_duration=timedelta(days=7))),
)
Quando precisar de funcionalidades em diferentes níveis de agregação (por exemplo, ao nível do cliente e ao nível do cliente-loja), use valores diferentes entity nas suas definições de funcionalidades. O mesmo DeltaTableSource pode ser partilhado entre funcionalidades com diferentes configurações de entidades.
StreamSource
StreamSource referência a um Stream. O Stream contém a configuração de ligação, autenticação, esquema e ingestão para a fonte de streaming. Para Kafka, as referências às colunas nas definições de características devem ser precedidas por value. ou key. para indicar qual parte da mensagem ler.
StreamSource(
full_name: str, # Required: Three-part Stream name (catalog.schema.stream)
filter_condition: Optional[str], # Optional: SQL WHERE clause applied before aggregation
)
Parâmetros:
-
full_name: O nome completo em três partes de um Stream (por exemplo,"my_catalog.my_schema.my_stream"). -
filter_condition(opcional): Uma cláusula SQLWHEREaplicada a dados de fluxo antes da agregação, usando referências a colunas com prefixo de pontos (por exemplo,"value.event_type = 'purchase'").
from databricks.feature_engineering.entities import StreamSource
stream_source = StreamSource(
full_name="my_catalog.my_schema.my_stream",
filter_condition="value.event_type = 'purchase'",
)
RequestSource
RequestSource define um esquema para dados que são fornecidos no momento da inferência na carga útil do pedido, em vez de serem consultados a partir de uma tabela pré-materializada. Durante o treino, estas colunas são extraídas do DataFrame rotulado passado para create_training_set. Durante o serviço de modelos, o chamador deve incluí-los na carga útil de pedido HTTP.
RequestSource é usado com ColumnSelection (para passar diretamente por um valor). Não suporta funções de agregação nem janelas temporais.
Definição do esquema
Defina o esquema como uma lista de FieldDefinition objetos, cada um especificando um nome de coluna e um ScalarDataType:
from databricks.feature_engineering.entities import (
FieldDefinition, RequestSource, ScalarDataType,
)
request_source = RequestSource(
schema=[
FieldDefinition(name="transaction_amount", data_type=ScalarDataType.DOUBLE),
FieldDefinition(name="vendor_id", data_type=ScalarDataType.STRING),
FieldDefinition(name="transaction_id", data_type=ScalarDataType.STRING),
FieldDefinition(name="transaction_time", data_type=ScalarDataType.DATE),
]
)
Tipos de dados suportados
RequestSourcesuporta os tipos escalares definidos em ScalarDataType: INTEGER, FLOAT, BOOLEAN, STRING, DOUBLE, LONG, TIMESTAMP, DATE, . SHORT Tipos complexos como arrays, mapas e structs não são suportados.
Como os dados dos pedidos são hidratados
| Context | Comportamento |
|---|---|
Formação (create_training_set) |
As colunas são extraídas do DataFrame rotulado. Os tipos são validados contra o esquema declarado. As incompatibilidades geram um erro (sem conjuração implícita). |
| Servir (endpoint do modelo) | As colunas são retiradas de dataframe_records ou dataframe_split dentro do pedido HTTP. Os valores JSON são convertidos para os tipos declarados (por exemplo, número JSON → DOUBLE). |
Modelo de assinatura
Quando um modelo é registado com log_model um conjunto de treino que inclui RequestSource características, as RequestSource colunas são adicionadas à assinatura do modelo MLflow como entradas necessárias. Isto significa que o esquema da API do endpoint de serviço reflete quais os campos que os chamadas devem fornecer no momento da inferência.
API de treino e inferência
create_training_set()
Cria um conjunto de dados de treino com cálculo de características corretas em ponto no tempo. Para mais detalhes, veja Modelos de Comboios com Vistas de Características.
FeatureEngineeringClient.create_training_set(
df: DataFrame, # DataFrame with training data
features: Optional[List[Feature]], # List of Feature objects
label: Union[str, List[str], None], # Label column name(s)
exclude_columns: Optional[List[str]] = None, # Optional: columns to exclude
) -> TrainingSet
log_model()
Regista um modelo com metadados de características para rastreio de linhagem e pesquisa automática de características durante a inferência. Para mais detalhes, veja Modelos de Comboios com Vistas de Características.
FeatureEngineeringClient.log_model(
model, # Trained model object
artifact_path: str, # Path to store model artifact
flavor: ModuleType, # MLflow flavor module (e.g., mlflow.sklearn)
training_set: TrainingSet, # TrainingSet used for training
registered_model_name: Optional[str], # Optional: register model in Unity Catalog
)
score_batch()
Realiza inferência em lote offline com pesquisa automática de funcionalidades. Utiliza os metadados das funcionalidades armazenadas com o modelo para calcular as funcionalidades de correção pontual no tempo, garantindo consistência no treino.
FeatureEngineeringClient.score_batch(
model_uri: str, # URI of logged model (e.g., "models:/catalog.schema.model/1")
df: DataFrame, # DataFrame with entity keys and timestamps
) -> DataFrame
O DataFrame de entrada deve conter as colunas da entidade e da série temporal usadas durante o treino. As funcionalidades são calculadas automaticamente a partir dos dados de origem.
fe = FeatureEngineeringClient()
# Batch scoring with automatic feature lookup
predictions = fe.score_batch(
model_uri="models:/main.ecommerce.fraud_model/1",
df=inference_df,
)
predictions.display()
Janelas temporais
As Feature Views suportam três tipos diferentes de janelas para controlar o comportamento de lookback em agregações baseadas em janelas temporais: rolamento, tumbling e deslizamento.
- Janelas rolantes olham para trás da hora do evento. A duração e o atraso são explicitamente definidos.
- As janelas de rotação são janelas temporais fixas e não sobrepostas. Cada ponto de dados pertence exatamente a uma janela.
- As janelas deslizantes são janelas de tempo sobrepostas e rolantes com um intervalo de deslizamento configurável.
A ilustração seguinte mostra como funcionam.
Janela de correr
Note
RollingWindow anteriormente se chamava ContinuousWindow. Se estiver a migrar de uma versão anterior do SDK, atualize as suas importações em conformidade.
As janelas rolantes são agregados up-todata e tempo real, normalmente usados sobre dados em streaming. Em pipelines de streaming, a janela rolante emite uma nova linha apenas quando o conteúdo da janela de comprimento fixo muda, como quando um evento entra ou sai. Quando uma funcionalidade de janela rolante é usada em pipelines de treino, é realizado um cálculo preciso de uma funcionalidade em ponto no tempo sobre os dados de origem usando a duração da janela de comprimento fixo imediatamente anterior ao carimbo temporal de um evento específico. Isto ajuda a prevenir o desvio online-offline ou fuga de dados. As características no tempo T agregam eventos a partir de [T − duração, T).
class RollingWindow(TimeWindow):
window_duration: datetime.timedelta
delay: Optional[datetime.timedelta] = None
A tabela seguinte lista os parâmetros para uma janela rolante. Os tempos de início e fim das janelas baseiam-se nestes parâmetros da seguinte forma:
- Hora de início:
evaluation_time - window_duration - delay(inclusivo) - Hora de término:
evaluation_time - delay(exclusivo)
| Parâmetro | Restrições |
|---|---|
delay (opcional) |
Deve ser ≥ 0 (desloca a janela para trás no tempo a partir do carimbo temporal da avaliação). Use delay para considerar qualquer atraso do sistema entre o momento em que o evento é criado e o carimbo temporal do evento, para evitar vazamentos futuros de eventos em conjuntos de dados de treino. Por exemplo, se houver um atraso de um minuto entre o momento em que os eventos são criados e estes eventos são eventualmente aterrados numa tabela de origem onde lhes é atribuído um carimbo temporal, então o atraso seria timedelta(minutes=1). |
window_duration |
Deve ser > 0 |
from databricks.feature_engineering.entities import RollingWindow
from datetime import timedelta
# Look back 7 days from evaluation time
window = RollingWindow(window_duration=timedelta(days=7))
Defina uma janela rolante com atraso usando o código abaixo.
# Look back 7 days, offset by 1 minute to account for data ingestion delay
window = RollingWindow(
window_duration=timedelta(days=7),
delay=timedelta(minutes=1)
)
Exemplos de janelas rolantes
window_duration=timedelta(days=7): Isto cria uma janela de retrospetiva de 7 dias que termina no momento atual da avaliação. Para um evento às 14:00 do Dia 7, isto inclui todos os eventos desde as 14:00 do Dia 0 até (mas não incluindo) as 14:00 do Dia 7.window_duration=timedelta(hours=1), delay=timedelta(minutes=30): Isto cria uma janela de retrospetiva de 1 hora que termina 30 minutos antes da hora da avaliação. Para um evento às 15:00, isto inclui todos os eventos das 13:30 até (mas não incluindo) 14:30. Isto é útil para compensar atrasos na ingestão de dados.
Janela de tombo
Para características definidas usando janelas de rotação, as agregações são calculadas sobre uma janela de comprimento fixo pré-determinada que avança por um intervalo de deslizamento, produzindo janelas não sobrepostas que particionam totalmente o tempo. Como resultado, cada evento na fonte contribui para exatamente uma janela. As características no momento t agregam dados de janelas que terminam em ou antes de t (exclusivo). O Windows começa na época Unix.
class TumblingWindow(TimeWindow):
window_duration: datetime.timedelta
A tabela seguinte lista os parâmetros para uma janela de tumbling.
| Parâmetro | Restrições |
|---|---|
window_duration |
Deve ser > 0 |
from databricks.feature_engineering.entities import TumblingWindow
from datetime import timedelta
window = TumblingWindow(
window_duration=timedelta(days=7)
)
Exemplo da janela que cai
-
window_duration=timedelta(days=5): Isto cria janelas de duração fixa pré-determinadas de 5 dias cada. Exemplo: A Janela #1 abrange do Dia 0 ao Dia 4, a Janela #2 abrange o Dia 5 ao Dia 9, a Janela #3 abrange o Dia 10 ao Dia 14, e assim sucessivamente. Especificamente, a Janela #1 inclui todos os eventos com carimbo temporal a partir00:00:00.00do Dia 0 até (mas não incluindo) quaisquer eventos com carimbo00:00:00.00temporal no Dia 5. Cada evento pertence exatamente a uma janela.
Janela deslizante
Para características definidas usando janelas deslizantes, as agregações são calculadas sobre uma janela de comprimento fixo pré-determinada que avança por um intervalo de deslizamento, produzindo janelas sobrepostas. Cada evento na fonte pode contribuir para a agregação de funcionalidades em várias janelas. As características no momento t agregam dados de janelas que terminam em ou antes de t (exclusivo). O Windows começa na época Unix.
class SlidingWindow(TimeWindow):
window_duration: datetime.timedelta
slide_duration: datetime.timedelta
A tabela seguinte lista os parâmetros para uma janela deslizante.
| Parâmetro | Restrições |
|---|---|
window_duration |
Deve ser > 0 |
slide_duration |
Deve ser > 0 e <window_duration |
from databricks.feature_engineering.entities import SlidingWindow
from datetime import timedelta
window = SlidingWindow(
window_duration=timedelta(days=7),
slide_duration=timedelta(days=1)
)
Exemplo da janela deslizante
-
window_duration=timedelta(days=5), slide_duration=timedelta(days=1): Isto cria janelas sobrepostas de 5 dias que avançam 1 dia a cada vez. Exemplo: A Janela #1 abrange o Dia 0 ao Dia 4, a Janela #2 abrange o Dia 1 ao Dia 5, a Janela #3 abrange o Dia 2 ao Dia 6, e assim sucessivamente. Cada janela inclui eventos desde00:00:00.00o dia de início até (mas não incluindo)00:00:00.00o dia final. Como as janelas se sobrepõem, um único evento pode pertencer a várias janelas (neste exemplo, cada evento pertence a até 5 janelas diferentes).
Gatilhos de materialização
Desencadeia o controlo quando um pipeline de materialização é executado. O tipo de gatilho depende do tipo de característica.
CronSchedule
Utilização CronSchedule para funcionalidades de agregação (AggregationFunction). O pipeline funciona num cronograma fixo definido por uma expressão cron de quartzo.
from databricks.feature_engineering.entities import CronSchedule
trigger = CronSchedule(
quartz_cron_expression="0 0 * * * ?", # Hourly
timezone_id="UTC",
)
TableTrigger
TableTrigger Use para ColumnSelection funcionalidades suportadas por um DeltaTableSource. O pipeline corre sempre que a tabela Delta a montante recebe um novo commit.
from databricks.feature_engineering.entities import TableTrigger
trigger = TableTrigger()
StreamingMode
StreamingMode Use para funcionalidades suportadas por um StreamSource. O pipeline funciona como um pipeline contínuo de streaming.
from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
StreamSource, Feature, AggregationFunction, Sum,
RollingWindow, OnlineStoreConfig, StreamingMode,
)
from datetime import timedelta
fe = FeatureEngineeringClient()
stream_source = StreamSource(full_name="my_catalog.my_schema.my_stream")
streaming_feature = fe.create_feature(
source=stream_source,
entity=["value.user_id"],
timeseries_column="value.event_time",
function=AggregationFunction(
operator=Sum(input="value.amount"),
time_window=RollingWindow(window_duration=timedelta(hours=1)),
),
catalog_name="my_catalog",
schema_name="my_schema",
name="user_purchase_sum",
)
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(),
)
Escolher um gatilho
| Tipo de funcionalidade | Trigger | Quando corre |
|---|---|---|
Agregação (AggregationFunction) a partir DeltaTableSource |
CronSchedule |
Num cron de cron fixo |
ColumnSelection (de DeltaTableSource) |
TableTrigger |
Em cada tabela de origem commit |
Características de StreamSource |
StreamingMode |
Transmissão contínua |
Não podes materializar funcionalidades que exijam diferentes tipos de gatilho numa única materialize_features chamada. Em vez disso, emita chamadas separadas.
Migrar funcionalidades beta para a Pré-visualização Pública
O Feature Views Public Preview introduz entidades de Feature de primeira classe no Unity Catalog, regidas pelos CREATE FEATURE privilégios e READ FEATURE e requerem databricks-feature-engineering a versão 0.16.0 ou posterior. Funcionalidades criadas durante a beta (com a versão 0.15.0) são armazenadas como funções do Catálogo Unity e não suportam toda a funcionalidade de Pré-visualização Pública. Para obter suporte de Pré-visualização Pública a longo prazo, recrie as suas funcionalidades beta com a versão 0.16.0. As funcionalidades têm de ser eliminadas e recriadas, não apenas rematerializadas.
Para mais informações sobre funcionalidades, consulte Visualizações de Funcionalidades.
O que precisas de fazer
- Atualizar para a 0.16.0. Esta é a versão cliente obrigatória para funcionalidades de Pré-visualização Pública (batch e streaming).
- Recria as tuas funcionalidades. As Vistas de Funcionalidades Beta devem ser eliminadas e recriadas, não rematerializadas, porque não suportam toda a funcionalidade de Pré-visualização Pública.
- Migra antes que a janela feche. As funcionalidades beta existentes devem ser migradas antes de 22 de julho de 2026.
Identificar funcionalidades beta e Pré-visualização Pública
As funcionalidades de Pré-visualização Pública aparecem como um objeto de funcionalidades no Catálogo Unity, por exemplo, no Explorador de Catálogos. As funcionalidades beta aparecem como uma função com uma definição YAML. Qualquer funcionalidade representada como função é uma funcionalidade beta que precisas de migrar.
Funcionalidades de migração beta
Migrar uma funcionalidade beta tem três partes:
- Recrie a funcionalidade como uma funcionalidade de Pré-visualização Pública.
- Rematerializar a funcionalidade, para que as suas tabelas offline e online sejam reconstruídas sob a nova funcionalidade.
- Depois de verificares as funcionalidades migradas, apaga as funcionalidades beta e as suas materializações.
Recriar as funcionalidades
Use list_beta_feature_views para encontrar as suas funcionalidades beta, Feature.clone() criar uma cópia não registada e register_feature re-registar cada cópia como uma funcionalidade de Pré-visualização Pública. A clonagem limpa o registo, catálogo e esquema para que a funcionalidade possa ser re-registada.
Para evitar colisões de nomes, regista funcionalidades migradas com um nome diferente ou num esquema diferente das funcionalidades beta. O exemplo seguinte volta a registar cada característica no seu esquema original com um _migrated sufixo de nome.
# Update this to the catalog whose beta Feature Views you want to migrate.
CATALOG_TO_MIGRATE = "main"
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
# 1. Find every beta Feature View in the catalog. Returns Feature objects,
# scanned across all schemas in the catalog.
beta_features = fe.list_beta_feature_views(catalog_name=CATALOG_TO_MIGRATE)
# Keep each beta feature paired with its migrated counterpart for the next steps.
migrations = []
for beta_feature in beta_features:
catalog_name, schema_name, leaf_name = beta_feature.full_name.split(".")
# 2. Clone the feature as an unregistered copy, renamed with a "_migrated" suffix.
cloned = beta_feature.clone(new_name=f"{leaf_name}_migrated")
# 3. Re-register the clone as a Public Preview feature.
migrated = fe.register_feature(
feature=cloned,
catalog_name=catalog_name,
schema_name=schema_name,
)
migrations.append((beta_feature, migrated))
Rematerializar as características migradas
Se uma funcionalidade beta fosse materializada, rematerializa-se a sua contraparte de Pré-visualização Pública para que as suas tabelas offline e online fossem reconstruídas sob a nova funcionalidade. Forneça as configurações offline e online da loja para a funcionalidade migrada e reconstrua o gatilho a partir da materialização existente da funcionalidade beta.
from databricks.feature_engineering.entities import (
CronSchedule,
OfflineStoreConfig,
OnlineStoreConfig,
TableTrigger,
)
for beta_feature, migrated in migrations:
# Inspect the beta feature's existing materializations to see what to rebuild and
# to reconstruct the same trigger.
trigger = None
needs_offline = needs_online = False
for mf in fe.list_materialized_features(feature_name=beta_feature.full_name):
needs_online = needs_online or bool(mf.is_online)
needs_offline = needs_offline or not mf.is_online
# Rebuild the trigger from the materialized feature.
if mf.cron_schedule_trigger is not None:
trigger = CronSchedule(
quartz_cron_expression=mf.cron_schedule_trigger.cron_expression,
timezone_id="UTC", # Materialized schedules run in UTC.
)
elif mf.table_trigger is not None:
trigger = TableTrigger()
elif mf.streaming_mode is not None:
# Streaming features use StreamingMode, which can be reused as-is.
trigger = mf.streaming_mode
if not (needs_offline or needs_online):
continue # The beta feature was never materialized.
catalog_name, schema_name, _ = migrated.full_name.split(".")
fe.materialize_features(
features=[migrated],
offline_config=OfflineStoreConfig(
catalog_name=catalog_name,
schema_name=schema_name,
table_name_prefix="migrated_features",
)
if needs_offline
else None,
online_config=OnlineStoreConfig(
catalog_name=catalog_name,
schema_name=schema_name,
table_name_prefix="migrated_features",
online_store_name="my_online_store",
)
if needs_online
else None,
trigger=trigger,
)
Note
Materializar cada funcionalidade na sua própria materialize_features chamada cria-se um pipeline separado. Para reduzir o custo de computação, agrupe funcionalidades que partilham um destino offline e online e são ativadas numa única materialize_features chamada ao passá-las em conjunto em features.
Eliminar as funcionalidades beta
Warning
Elimine as funcionalidades beta e as suas materializações apenas depois de verificar que as funcionalidades migradas e os seus dados materializados estão corretos. A supressão é irreversível.
Depois de verificar as funcionalidades migradas, apague as materializações de cada funcionalidade beta e depois a própria funcionalidade beta.
for beta_feature, _ in migrations:
# Delete the beta feature's materializations first.
mfs = list(fe.list_materialized_features(feature_name=beta_feature.full_name))
offline_mfs = [mf for mf in mfs if not mf.is_online]
if offline_mfs:
# Aggregation features pair an offline and online table; deleting the offline
# materialized feature removes its paired online table too.
for mf in offline_mfs:
fe.delete_materialized_feature(materialized_feature=mf)
else:
# Online-only features (ColumnSelection, streaming) have no offline pair; delete
# the online materialized feature directly.
for mf in mfs:
fe.delete_materialized_feature(materialized_feature=mf)
# Then delete the beta feature definition.
fe.delete_feature(full_name=beta_feature.full_name)