Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
Le rétroremplissage recalcule les valeurs matérialisées de vos Feature Views sur les plages de temps que vous choisissez. Utilisez-le après avoir corrigé ou ajouté des données sources historiques, afin que les materializations hors ligne et en ligne reflètent les données mises à jour.
La matérialisation calcule les valeurs de feature récentes à chaque exécution et ne recalcule pas les valeurs déjà écrites. Un changement des données sources pour une plage de temps passée n’atteint pas les valeurs matérialisées tant que vous n’effectuez pas un backfill sur cette plage de temps. Utilisez backfill dans des situations telles que les suivantes :
- Un problème de qualité des données en amont a affecté une plage de temps passée, et vous avez corrigé les lignes sources.
- Les données sources d’une période passée sont arrivées après que la matérialisation les ait déjà traitées.
Un backfill est un travail ponctuel qui s’exécute parallèlement à votre materialization programmée. Cela ne change pas le calendrier de matérialisation. Voir Matérialiser les vues des fonctionnalités.
Requirements
-
databricks-feature-engineering0.18.2 et plus. Pour d’autres exigences, voir Exigences. - Chaque Feature View est une fonctionnalité d’agrégation par lots qui utilise un
DeltaTableSourceet unSlidingWindowouTumblingWindow. Les Lifetime windows ne sont pas prises en charge. - Chaque Feature View est matérialisée et a terminé au moins une exécution de matérialisation. Le backfill recalcule des valeurs déjà écrites par la matérialisation, donc il ne peut pas matérialiser une Feature View pour la première fois.
- Vous commencez le remplissage avec le même utilisateur ou principal de service qui a matérialisé les Feature Views, depuis l’espace de travail où elles sont matérialisées.
Permissions
Le backfill s’exécute avec votre identité, et il lit et écrit les mêmes tables que votre materialization, donc il utilise les mêmes privilèges que votre materialization. Pour les descriptions complètes des privilèges du Catalogue Unity, voir la référence des privilèges du Catalogue Unity.
- Vous devez avoir
MANAGEsur chaque Feature View que vous rétroalimentez. - Pour vérifier une réexécution, il faut
READ FEATUREsur chaque Feature View de la réexécution. Pour annuler un backfill, il vous fautMANAGEsur chaque vue de fonctionnalité du backfill.
Démarrer le rétroremplissage
Pour commencer un backfill, appelez backfill_features avec les Feature Views à backfiller et une ou plusieurs plages temporelles :
FeatureEngineeringClient.backfill_features(
*, # Arguments are keyword-only
features: List[Union[str, Feature]], # Feature Views to backfill, as Feature objects or full names
backfill_ranges: List[BackfillRange], # Time ranges of source data to reprocess
request_id: Optional[str] = None, # Idempotency token, a UUID
tags: Optional[Dict[str, str]] = None, # Custom tags for cost attribution
budget_policy_id: Optional[str] = None, # Serverless usage policy for cost attribution
wait: bool = False, # Wait for the backfill to finish
) -> BackfillStatus:
Toutes les vues de caractéristiques d’un même appel doivent produire des valeurs aux mêmes moments. Ils doivent partager le même intervalle entre les valeurs (le slide_duration d’un SlidingWindow ou le window_duration d’un TumblingWindow) et le même offset. Sinon, l’appel échoue avec une erreur qui regroupe les Feature Views par intervalle, ce qui permet de lancer un backfill séparé pour chaque groupe.
Chaque BackfillRange possède un start_time, qui est inclusif, et un end_time, qui est exclusif. Les deux sont des valeurs Pythondatetime. A datetime sans fuseau horaire est lu comme UTC. Chaque start_time doit être antérieur à son end_time, et les plages d’un appel ne peuvent pas se chevaucher. Pour savoir comment backfill interprète chaque plage, voir Comment backfill applique les plages de temps.
L’exemple suivant remplit une semaine d’historique pour deux Feature Views :
from datetime import datetime, timezone
from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import BackfillRange
fe = FeatureEngineeringClient()
backfill = fe.backfill_features(
features=[
"main.feature_store.amount_sum_sliding_7d_1d",
"main.feature_store.transaction_count_sliding_7d_1d",
],
backfill_ranges=[
BackfillRange(
start_time=datetime(2026, 3, 1, tzinfo=timezone.utc),
end_time=datetime(2026, 3, 8, tzinfo=timezone.utc),
)
],
)
print(backfill.operation_name) # operations/<operation-id>
Avant de commencer le remblai, backfill_features vérifie ce qui suit. Si une vérification échoue, l’appel échoue avec une erreur qui nomme les Feature Views concernées.
- Chaque Vue de Caractéristiques répond aux exigences, y compris une exécution de matérialisation terminée.
- Vous avez matérialisé chaque Feature View.
- Vous avez les privilèges nécessaires.
La méthode renvoie un BackfillStatus qui décrit le backfill. Il identifie la operation_name valeur de remplacement, dans le format operations/<operation-id>. Voir « Surveiller ou annuler un backfill ».
Pour que l’appel puisse être relancé sans risque, passez un UUID comme request_id. Une nouvelle tentative avec la même méthode request_id renvoie le backfill d’origine au lieu d’en démarrer un nouveau.
Pour attribuer le coût d’un backfill, passer tags, budget_policy_id, ou les deux. Ils ne s’appliquent qu’à ce remblai.
Voir Coûts d’attributs avec tags et politiques d’utilisation serverless.
Comment le backfill applique les plages de temps
Chaque plage sélectionne les données sources à retraiter : les lignes source avec des horodatages à partir de start_time et avant end_time. Le remplissage s’applique à chaque plage comme suit :
- Les plages sont alignées sur des valeurs entières de fonctionnalité. Le backfill recalcule toutes les valeurs de la fonctionnalité, élargissant ainsi chaque plage vers l’extérieur jusqu’aux moments les plus proches auxquels la fonctionnalité produit une valeur. Une
SlidingWindowvariable produit une valeur chaqueslide_duration, et uneTumblingWindowvariable en produit une chaquewindow_duration, décalée par le/laoffsetde la fenêtre si vous en définissez une. Par exemple, pour une fonctionnalité avec unslide_durationd’une heure, une plage de 1h30 à 2h30 devient de 1h00 à 3h00. Vous n’avez pas besoin d’aligner les plages vous-même. Les plages qui se chevauchent après l’alignement sont combinées en une seule. - Les valeurs après la plage peuvent changer. Le backfill réécrit chaque valeur de caractéristique dont la fenêtre temporelle inclut les données retraitées. Une fenêtre peut se terminer après
end_time, donc les valeurs pouvant aller jusqu’à unwindow_durationaprèsend_timepeuvent changer. Par exemple, pour une fonctionnalité avec une durée de 7window_durationjours , les valeurs jusqu’à 7 jours aprèsend_timepeuvent changer. - Le rattrapage s’arrête aux valeurs matérialisées les plus récentes. Le backfill ne recalcule que l’historique déjà écrit par la matérialisation. Si une plage dépasse les valeurs matérialisées les plus récentes, le backfill s’arrête là et laisse la plage de temps plus tardive à votre matérialisation prévue.
- Les bornes non définies prennent la valeur des données disponibles. Si vous omettez
start_time, la plage commence à l’horodatage le plus ancien dans les données sources. Si vous omettezend_time, la plage s’étend aux valeurs matérialisées les plus récentes.
Les backfill_ranges d’un BackfillStatus sont vos plages après alignement. Le backfill ne les réduit pas aux valeurs matérialisées les plus récentes, donc une plage indiquée peut dépasser les valeurs recalculées par le backfill. Vous n’avez pas besoin de remplir rétroactivement les valeurs ultérieures, car votre matérialisation programmée les calcule à partir des données sources actuelles.
Tables hors ligne et en ligne
Le backfill met à jour la table hors ligne d’une Feature View et, si la Feature View est également matérialisée dans un magasin en ligne, sa table en ligne. Pour une Feature View avec les deux, le backfill recalcule la table hors ligne puis republie la table en ligne à partir de celle-ci. Tu ne peux en renseigner qu’un seul a posteriori.
Le tableau en ligne contient la valeur la plus récente pour chaque entité. Un backfill ne modifie les valeurs en ligne que lorsqu’il modifie la dernière valeur d’une entité.
Surveillez ou annulez un backfill
backfill_features revient sans attendre la fin du backfill. Pour attendre, ignorer wait=True ou appeler wait_for_backfill avec le statut retourné :
backfill = fe.wait_for_backfill(backfill=backfill)
wait_for_backfill retourne la version finale BackfillStatus lorsque le backfill réussit. Si le backfill échoue ou est annulé, il génère OperationFailed une erreur qui décrit la raison. Pour limiter la durée d’attente, passez timeout en tant que timedelta. Si le backfill n’est pas terminé d’ici là, wait_for_backfill déclenche un TimeoutError. Arrêter l’attente n’annule pas le rattrapage.
Pour vérifier un backfill sans attendre, ou depuis un autre notebook ou un autre job, appelez get_backfill avec le nom de l’opération :
backfill = fe.get_backfill(operation_name="operations/<operation-id>")
print(backfill.state) # For example, BackfillState.RUNNING
Un BackfillStatus possède les champs suivants :
-
operation_name: Le nom qui identifie le remblai. -
state: L’état du remblai, sous forme de valeurBackfillState. -
feature_full_names: Les noms complets des Feature Views dans le backfill. -
backfill_ranges: Les plages de temps alignées, représentées sous forme de valeursBackfillRangedélimitées en UTC. -
error: La raison pour laquelle le backfill a échoué. Ce champ n’est défini que lorsquestateestFAILED.
L’état de backfill est l’une des valeurs suivantes :
| State | Description |
|---|---|
PENDING |
Le backfill a été accepté et n’a pas encore démarré. |
RUNNING |
Le backfill est en cours. |
SUCCEEDED |
Le backfill s'est terminé et a recalculé les valeurs de feature dans les plages concernées. |
FAILED |
Le rétroremplissage s’est arrêté à cause d’une erreur. Voir Récupérer après un backfill ayant échoué. |
CANCELLED |
Le rétroremplissage a été annulé avant sa fin. |
Si vous n’avez pas le nom de l’opération, trouvez le backfill le plus récent d’une feature matérialisée dans le champ latest_backfill_operation retourné par list_materialized_features, et passez-le à get_backfill.
Pour annuler un backfill, appelez cancel_backfill avec son statut :
fe.cancel_backfill(backfill=backfill)
L’annulation d’une requête de backfill demande son arrêt. Un backfill qui est sur le point de se terminer peut toujours réussir, donc vérifiez son état final avec get_backfill. Annuler un backfill déjà terminé n’a aucun effet. Un backfill annulé peut laisser certaines valeurs de caractéristiques recalculées, comme décrit dans Récupérer après un backfill ayant échoué.
Concurrency
Un backfill s’exécute en parallèle de votre matérialisation planifiée. Des backfills de différentes Feature Views peuvent également s’exécuter simultanément.
Un seul backfill peut s’exécuter pour une Feature View à la fois. Si vous lancez un backfill pour une Feature View qui a déjà un backfill en cours, la requête échoue avec une ALREADY_EXISTS erreur. Attends que le backfill précédent soit terminé avant de commencer le suivant.
Récupérer après l’échec d’un backfill
Un backfill défaillant ou annulé peut s’arrêter avant d’être terminé. Chaque valeur que le backfill a réécrite avant de s’arrêter est entièrement recalculée. Les valeurs non atteintes conservent leurs valeurs antérieures, donc certaines Feature Views ou plages temporelles peuvent ne pas être mises à jour.
Pour récupérer, recommencez le même remplissage. Si vous avez fourni un request_id, fournissez-en un nouveau, car une nouvelle tentative avec l’original request_id retourne le backfill ayant échoué au lieu d’en commencer un nouveau. Le backfill peut être répété sans risque. Si les données sources n’ont pas changé, recalculer une plage dont le calcul a déjà réussi produit les mêmes valeurs.
Limitations
- Seules les fonctionnalités d’agrégation par lots qui utilisent un
DeltaTableSourceet unSlidingWindowouTumblingWindowpeuvent faire l’objet d’un remplissage rétroactif. Les fonctionnalités de streaming, les fonctionnalitésColumnSelection, les fonctionnalités avec unRollingWindowouSawtoothWindow, les fonctionnalités avec une fenêtre d’attribution à vie, et les fonctionnalités avec d’autres sources, telles queRequestSource, ne peuvent pas être comblées. - Les Feature Views qui produisent des valeurs à différents intervalles ou décalages ne peuvent pas partager un seul backfill. Commencez un backfill séparé pour chaque groupe.
- Backfill met à jour la table hors ligne d’une Feature View et, si la Feature View est également matérialisée dans un magasin en ligne, sa table en ligne. Tu ne peux pas en renseigner qu’un seul a posteriori.
- Le backfill ne couvre pas les plages temporelles après les dernières valeurs matérialisées. La vue matérialisée planifiée les remplit.