GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — feat: Unify Feature Transformations and Feature Views by franciscojavierarceo · Pull Request #5747 · feast-dev/feast

Conversation

@franciscojavierarceo

@franciscojavierarceo franciscojavierarceo commented Nov 28, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

What this PR does / why we need it:

This PR refactors the transformation system with a cleaner architecture that separates transformation logic from execution. Transformations should focus on HOW to transform data, while FeatureViews handle WHEN and WHERE to execute.

Changes:

  • Added: feature_transformation field to FeatureView for transformation logic
  • Added: transform: bool = True parameter to API methods for per-call control
  • Added: Schema validation for pre-transformed data (transform=False)
  • Added: Transformation execution logic in online/offline feature retrieval
  # Define transformation logic
  @transformation(mode="python")
  def driver_features(inputs):
      return {"conv_plus_acc": [c + a for c, a in zip(inputs["conv_rate"], inputs["acc_rate"])]}

  # Create FeatureView with transformation
  fv = FeatureView(
      name="driver_computed_features",
      source=driver_source,
      entities=[driver],
      schema=[Field(name="conv_plus_acc", dtype=Float64)],
      feature_transformation=driver_features,  # ← NEW
      online=True,
  )

  # API-level transformation control
  # Execute transformations (default)
  features = store.get_online_features(
      features=["driver_computed_features:conv_plus_acc"],
      entity_rows=entity_rows,
      transform=True  # ← NEW (default)
  )

  # Skip transformations for external batch jobs
  features = store.get_online_features(
      features=["driver_computed_features:conv_plus_acc"],
      entity_rows=spark_transformed_rows,
      transform=False  # ← NEW: skip + validate schema
  )

Which issue(s) this PR fixes:

#4584, #5716, #5689

Misc

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

ntkathole reacted with hooray emoji
All reactions
  • 🎉 1 reaction
@franciscojavierarceo
franciscojavierarceo requested a review from a team as a code owner November 28, 2025 18:20
@franciscojavierarceo
franciscojavierarceo force-pushed the refactor-odfv branch 2 times, most recently from 2899413 to 649c429 Compare December 1, 2025 21:47
@franciscojavierarceo franciscojavierarceo added the ok-to-test label Dec 2, 2025
ntkathole
ntkathole reviewed Dec 11, 2025
View reviewed changes
Comment thread sdk/python/feast/transformation/base.py Outdated
from feast.feature_view import FeatureView as FV

for src in sources:
if not isinstance(src, (FV, type(src).__name__ == "FeatureView")):

@ntkathole ntkathole Dec 11, 2025

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if not isinstance(src, (FV, type(src).__name__ == "FeatureView")):
if not isinstance(src, FeatureView):

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
ntkathole
ntkathole reviewed Dec 11, 2025
View reviewed changes
Comment thread sdk/python/feast/feature_view.py Outdated
owner: str = "",
mode: Optional[Union["TransformationMode", str]] = None,
feature_transformation: Optional[Transformation] = None,
when: Optional[Union[TransformationTiming, str]] = None,

@ntkathole ntkathole Dec 11, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need updates to proto ? when and online_enabled not serialized in from_proto.

Also, modify __eq__() and __copy__() for consider these new attributes ?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@ntkathole
ntkathole force-pushed the refactor-odfv branch from 8b578bf to c77cb83 Compare December 11, 2025 11:58
@haoxu0

haoxu0 commented Dec 16, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Collaborator

I think when can be a bit confusing. even for 'batch', it can be 'on_read' or 'on_write'. I think on a different angle, should transformation be in the scope of writing, and isn't transformation only responsible for transforming the data?

FeatureView as the actually data assets, I think makes more sense to having the API.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@franciscojavierarceo

franciscojavierarceo commented Dec 23, 2025

Copy link
Copy Markdown
Member Author

I think when can be a bit confusing. even for 'batch', it can be 'on_read' or 'on_write'. I think on a different angle, should transformation be in the scope of writing, and isn't transformation only responsible for transforming the data?

FeatureView as the actually data assets, I think makes more sense to having the API.

Yeah, that's fair. @HaoXuAI I updated the PR, lmk what you think.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

haoxu0
haoxu0 reviewed Dec 23, 2025
View reviewed changes
Comment thread sdk/python/feast/feature_view.py Outdated
self.transform_when = transform_when

# Auto-infer online setting based on transform_when pattern
if transform_when in [

@haoxu0 haoxu0 Dec 23, 2025

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So why batch on read/write forces online to be true?
I think we need to think about if we really need a new tranform_when config. And if we need it, what is its relation with online/offline.
I think it might be counterintuitive that if this featureview is only used by batch or stream or on demand. what if the user defines it today as one mode and wants to change it to another one or allow both mode in the future?
My personal pint of view is removing any config for this. As long as you define the transformation, it will be applied to run before writing to destination. Use online/offline to control the destination only, if both are off, then no write. For any transformation needed on read, this should be configured at API level. Fo example, you can put get_online_feature(transform=true) to force transformation.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@franciscojavierarceo franciscojavierarceo Dec 23, 2025

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we need to think about if we really need a new tranform_when config. And if we need it, what is its relation with online/offline.

Here's how things actually work:

  1. Batch
  • Sometimes data can be transformed online
    1. On Reads
    2. On Writes
  • Sometimes not, and that's basically a batch transform with no feature server transformation and pure materialization
  1. Streaming
  • Handles historical data the same way it handles online serving

that's really what the transform_when indicates.

We need something other than online because the rest will be executed by the server and you can't orchestrate the transformation on write during retrieval.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@franciscojavierarceo franciscojavierarceo Dec 23, 2025

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with renaming something but we need something equivalent to write_to_online_store that's more obvious.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@haoxu0 haoxu0 Dec 25, 2025

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

online = true means write to online store.

transform_on_write should be removed from the server. it's a hacky way. #5283. this PR doesn't get enough reviews I think.
#5300. I think this one is also not ideal implementation as well.

When you use get_online_feature, you should assign it a transform=true to run transformation in "retrieval".

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@haoxu0 haoxu0 Dec 25, 2025

Copy link
Copy Markdown
Collaborator

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've read through the feature server code and on demand feature view implementation. I think a lot code needs to be refactored. And if you think there is some lines of code won't work you can tag me. I'll try to explain it

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@franciscojavierarceo franciscojavierarceo Dec 25, 2025

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes we agreed on this direction and I'm going to implement things that way. Just need to finish the work.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@franciscojavierarceo
franciscojavierarceo requested a review from a team as a code owner January 5, 2026 04:17
@franciscojavierarceo
franciscojavierarceo requested review from ejscribner, robhowley and shuchu and removed request for a team January 5, 2026 04:17
@franciscojavierarceo
franciscojavierarceo force-pushed the refactor-odfv branch 2 times, most recently from 5abbec2 to e5f074e Compare January 5, 2026 15:18
franciscojavierarceo added 13 commits January 5, 2026 11:26
@franciscojavierarceo
feat: Add unified transformation
837e34f
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
feat: Unify transformations
d12fbfd
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
feat: Unify Transformations
9a2df49
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
feat: Unify Transformations
9aceb7f
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
updated docs
5c8b93c
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
refactor: separate transformation logic from execution decisions with…
6d5ce47
… auto-inference

Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
format
9380cf9
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
incorporaitng feedback
5b759ed
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
updated
2d7a43b
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
fix
b6299d2
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
linter
3726733
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
cleanup
f55d4b4
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
cleanup
716e692
Signed-off-by: Francisco Javier Arceo <[email protected]>
franciscojavierarceo added 7 commits January 5, 2026 11:26
@franciscojavierarceo
more fix
a4f2e0a
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
more fix
02ae40b
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
updated
74de467
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
fix
c360aef
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
fix
f73431c
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
fix
50e536a
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
fix
a87c4b4
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
franciscojavierarceo force-pushed the refactor-odfv branch from e5f074e to a87c4b4 Compare January 5, 2026 16:28
franciscojavierarceo and others added 14 commits January 5, 2026 11:42
@franciscojavierarceo
Merge branch 'master' into refactor-odfv
e2f722c
@franciscojavierarceo
lint
dde05bd
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
fix
0e1f037
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
linter
662e21b
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
fix linter
9f48c75
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
fix
a058aac
Signed-off-by: Francisco Javier Arceo <[email protected]>
@jatin5251 @franciscojavierarceo
fix(redis): Preserve millisecond timestamp precision for Redis online…
b8771c9
… store (#5807)

* Update redis.py

Add millisecond-precision timestamp support to Redis online store

Signed-off-by: Jatin Kumar <[email protected]>

* Update redis.py

sub-second precision when returning timestamps to client

Signed-off-by: Jatin Kumar <[email protected]>

* Update redis.py

fix(redis): preserve millisecond timestamp precision

Signed-off-by: Jatin Kumar <[email protected]>

* Update redis.py

fix: Remove whitespace on blank lines (W293)

Signed-off-by: Jatin Kumar <[email protected]>

---------

Signed-off-by: Jatin Kumar <[email protected]>
@samuelkim7 @franciscojavierarceo
feat: Add GCS registry store in Go feature server (#5818)
34d9b52
Signed-off-by: samuelkim7 <[email protected]>
@franciscojavierarceo
chore: Refactor some unit tests into integration tests (#5820)
6c35d45
* chore: Refactor some unit tests into integration tests

Signed-off-by: Francisco Javier Arceo <[email protected]>

* chore: Refactor some unit tests into integration tests

Signed-off-by: Francisco Javier Arceo <[email protected]>

* rename TestConfig

Signed-off-by: Francisco Javier Arceo <[email protected]>

* rename TestConfig

Signed-off-by: Francisco Javier Arceo <[email protected]>

* add integration flag

Signed-off-by: Francisco Javier Arceo <[email protected]>

* update paths

Signed-off-by: Francisco Javier Arceo <[email protected]>

* update paths

Signed-off-by: Francisco Javier Arceo <[email protected]>

---------

Signed-off-by: Francisco Javier Arceo <[email protected]>
@Srihari1192 @franciscojavierarceo
test: Remove e2e_rhoai package tests
5bcd6e6
Signed-off-by: Srihari <[email protected]>
@franciscojavierarceo
fix
61812ba
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
fix
d4adcd5
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
fix
a007be3
Signed-off-by: Francisco Javier Arceo <[email protected]>
@franciscojavierarceo
uploading progress
416b15c
Signed-off-by: Francisco Javier Arceo <[email protected]>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@ntkathole ntkathole ntkathole left review comments
@haoxu0 haoxu0 haoxu0 left review comments
@shuchu shuchu Awaiting requested review from shuchu shuchu is a code owner automatically assigned from feast-dev/maintainers
@ejscribner ejscribner Awaiting requested review from ejscribner ejscribner is a code owner automatically assigned from feast-dev/maintainers
@robhowley robhowley Awaiting requested review from robhowley robhowley is a code owner automatically assigned from feast-dev/maintainers

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

ok-to-test

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

6 participants

@franciscojavierarceo @haoxu0 @ntkathole @jatin5251 @samuelkim7 @Srihari1192
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.