[Alpha] Feature View Versioning
Feature view versioning automatically tracks schema and UDF changes to feature views. Every time feast apply detects a change, a versioned snapshot is saved to the registry. This enables:
Audit trail — see what a feature view looked like at any point in time
Safe rollback — pin serving to a prior version with
version="v0"in your definitionMulti-version serving — serve both old and new schemas simultaneously using
@v<N>syntaxStaged publishing — use
feast apply --no-promoteto publish a new version without making it the default
How It Works
Version tracking is fully automatic. You don't need to set any version parameter — just use feast apply as usual:
First apply — Your feature view definition is saved as v0.
Change something and re-apply — Feast detects the change, saves the old definition as a snapshot, and saves the new one as v1. The version number auto-increments on each real change.
Re-apply without changes — Nothing happens. Feast compares the new definition against the active one and skips creating a version if they're identical (idempotent).
Another change — Creates v2, and so on.
feast apply # First apply → v0
# ... edit schema ...
feast apply # Detects change → v1
feast apply # No change detected → still v1 (no new version)
# ... edit source ...
feast apply # Detects change → v2Key details:
Automatic snapshots: Versions are created only when Feast detects an actual change to the feature view definition (schema or UDF). Metadata-only changes (description, tags, TTL) update in place without creating a new version.
Separate history storage: Version history is stored separately from the active feature view definition, keeping the main registry lightweight.
Backward compatible: The
versionparameter is fully optional. Omitting it (or settingversion="latest") preserves existing behavior — you get automatic versioning with zero changes to your code.
ConfigurationVersion history tracking is always active — no configuration needed. Every feast apply that changes a feature view automatically records a version snapshot.
feast apply that changes a feature view automatically records a version snapshot.To enable versioned online reads (e.g., fv@v2:feature), add enable_online_feature_view_versioning: true to your registry config in feature_store.yaml:
When this flag is off, version-qualified refs (e.g., fv@v2:feature) in online reads will raise errors, but version history, version listing, version pinning, and version lookups all work normally.## Pinning to a Specific Version
You can pin a feature view to a specific historical version by setting the version parameter. When pinned, feast apply replaces the active feature view with the snapshot from that version. This is useful for reverting to a known-good definition.
When pinning, the feature view definition (schema, source, transformations, etc.) must match the currently active definition. If you've also modified the definition alongside the pin, feast apply will raise a FeatureViewPinConflict error. To apply changes, use version="latest". To revert, only change the version parameter.
The snapshot's content replaces the active feature view. Version history is not modified by a pin; the existing v0, v1, v2, etc. snapshots remain intact.
After reverting with a pin, you can go back to normal auto-incrementing behavior by removing the version parameter (or setting it to "latest") and running feast apply again. If the restored definition differs from the pinned snapshot, a new version will be created.
Version string formats
"latest" (or omitted)
Always use the latest version (auto-increments on changes)
"v0", "v1", "v2", ...
Pin to a specific version number
"version0", "version1", ...
Equivalent long form (case-insensitive)
Staged Publishing (--no-promote)
--no-promote)By default, feast apply atomically saves a version snapshot and promotes it to the active definition. For breaking schema changes, you may want to stage the new version without disrupting unversioned consumers.
The --no-promote flag saves the version snapshot without updating the active feature view definition. The new version is accessible only via explicit @v<N> reads and --version materialization.
CLI usage:
Python SDK equivalent:
Phased rollout workflow
Stage the new version:
This publishes v2 without promoting it. All unversioned consumers continue using v1.
Populate the v2 online table:
Migrate consumers one at a time:
Consumer A switches to
driver_stats@v2:trips_todayConsumer B switches to
driver_stats@v2:avg_rating
Promote v2 as the default:
Or pin to v2: set
version="v2"in the definition and runfeast apply.
Listing Version History
Use the CLI to inspect version history:
Or programmatically via the Python SDK:
Version-Qualified Feature References
You can read features from a specific version of a feature view by using version-qualified feature references with the @v<N> syntax:
How it works:
driver_stats:trips_todayis equivalent todriver_stats@latest:trips_today— it reads from the currently active versiondriver_stats@v2:trips_todayreads from the v2 snapshot stored in version history, using a version-specific online store tableMultiple versions of the same feature view can be queried in a single request (e.g.,
driver_stats@v1:tripsanddriver_stats@v2:trips_daily)
Backward compatibility:
The unversioned online store table (e.g.,
project_driver_stats) is treated as v0Only versions >= 1 get
_v{N}suffixed tables (e.g.,project_driver_stats_v1)Pre-versioning users' existing data continues to work without changes —
@latestresolves to the active version, which for existing unversioned FVs is v0
Materialization: Each version requires its own materialization. After applying a new version, run feast materialize to populate the versioned table before querying it with @v<N>.
Supported Feature View Types
Versioning is supported on all three feature view types:
FeatureView(andBatchFeatureView)StreamFeatureViewOnDemandFeatureView
Online Store SupportCurrently, version-qualified online reads (@v<N>) are only supported with the SQLite online store. Support for additional online stores (Redis, DynamoDB, Bigtable, Postgres, etc.) will be added based on community priority.
@v<N>) are only supported with the SQLite online store. Support for additional online stores (Redis, DynamoDB, Bigtable, Postgres, etc.) will be added based on community priority.If you need versioned online reads for a specific online store, please open a GitHub issue describing your use case and which store you need. This helps us prioritize development.
Version history tracking in the registry (listing versions, pinning, --no-promote) works with all registry backends (file, SQL, Snowflake).
Full Details
For the complete design, concurrency semantics, and feature service interactions, see the Feature View Versioning RFC.
Naming Restrictions
Feature references use a structured format: feature_view_name@v<N>:feature_name. To avoid ambiguity, the following characters are reserved and must not appear in feature view or feature names:
@— Reserved as the version delimiter (e.g.,driver_stats@v2:trips_today).feast applywill reject feature views with@in their name. If you have existing feature views with@in their names, they will continue to work for unversioned reads, but we recommend renaming them to avoid ambiguity with the@v<N>syntax.:— Reserved as the separator between feature view name and feature name in fully qualified feature references (e.g.,driver_stats:trips_today).
Known Limitations
Online store coverage — Version-qualified reads (
@v<N>) are SQLite-only today. Other online stores are follow-up work.Offline store versioning — Versioned historical retrieval is not yet supported.
Version deletion — There is no mechanism to prune old versions from the registry.
Cross-version joins — Joining features from different versions of the same feature view in
get_historical_featuresis not supported.Feature services — Feature services always resolve to the active (promoted) version.
--no-promoteversions are not served until promoted.
Last updated
Was this helpful?