Title: `RemoteOnlineStore.online_write_batch` hardcodes timestamp column names (`created`/`event_timestamp`), breaking remote `write_to_online_store` for feature views with a custom `created_timestamp_column` · Issue #6595 · feast-dev/feast · GitHub
Open Graph Title: `RemoteOnlineStore.online_write_batch` hardcodes timestamp column names (`created`/`event_timestamp`), breaking remote `write_to_online_store` for feature views with a custom `created_timestamp_column` · Issue #6595 · feast-dev/feast
X Title: `RemoteOnlineStore.online_write_batch` hardcodes timestamp column names (`created`/`event_timestamp`), breaking remote `write_to_online_store` for feature views with a custom `created_timestamp_column` · Issue #6595 · feast-dev/feast
Description: Expected Behavior Remote write_to_online_store should round-trip regardless of the feature view's timestamp column names. Writing works for a local provider (the full dataframe is converted in-process using the source's configured column...
Open Graph Description: Expected Behavior Remote write_to_online_store should round-trip regardless of the feature view's timestamp column names. Writing works for a local provider (the full dataframe is converted in-proc...
X Description: Expected Behavior Remote write_to_online_store should round-trip regardless of the feature view's timestamp column names. Writing works for a local provider (the full dataframe is converted in-...
Opengraph URL: https://github.com/feast-dev/feast/issues/6595
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"`RemoteOnlineStore.online_write_batch` hardcodes timestamp column names (`created`/`event_timestamp`), breaking remote `write_to_online_store` for feature views with a custom `created_timestamp_column`","articleBody":"## Expected Behavior\n\nRemote `write_to_online_store` should round-trip regardless of the feature view's\ntimestamp column names. Writing works for a local provider (the full dataframe is\nconverted in-process using the source's configured column names) and should behave the\nsame when the online store is remote (`online_store: { type: remote }` / the feature\nserver `/write-to-online-store` endpoint).\n\n## Current Behavior\n\nWriting to the online store through the remote path fails on the server with:\n\n```\nKeyError: 'Field \"created_at\" does not exist in schema'\n```\n\nwhenever the feature view's batch source sets `created_timestamp_column` (or\n`timestamp_field`) to anything other than the literals `\"created\"` /\n`\"event_timestamp\"`.\n\nRoot cause — `RemoteOnlineStore.online_write_batch` serializes the timestamps into\n**hardcoded** column names when building the request body:\n\n```python\n# sdk/python/feast/infra/online_stores/remote.py (online_write_batch)\ncolumnar_data[\"event_timestamp\"].append(_to_naive_utc(event_ts).isoformat())\ncolumnar_data[\"created\"].append(\n _to_naive_utc(created_ts).isoformat() if created_ts else None\n)\nreq_body = {\"feature_view_name\": table.name, \"df\": columnar_data, ...}\npost_remote_online_write(config=config, req_body=req_body)\n```\n\nThe server rebuilds the dataframe verbatim and runs the standard conversion:\n\n```python\n# sdk/python/feast/feature_server.py\ndf = pd.DataFrame(request.df) # columns: entities, features, event_timestamp, created\nstore.write_to_online_store(..., df=df)\n# -\u003e _prep_rows_to_write_for_ingestion -\u003e _convert_arrow_to_proto\n```\n\nbut `_convert_arrow_fv_to_proto` (in `utils.py`) resolves the created-timestamp column\nby the **feature-view-configured name**, not the hardcoded `\"created\"`:\n\n```python\nif feature_view.batch_source.created_timestamp_column:\n created_timestamps = [\n ... table.column(\n feature_view.batch_source.created_timestamp_column # e.g. \"created_at\"\n ) ...\n ]\n```\n\nSo the client emits the column as `created` and the server looks it up as `created_at`\n→ `KeyError`. The timestamp **value is not lost** — it is on the wire under `created`;\nit is simply **labeled with a name the server does not look up**. The client write and\nthe server-side conversion disagree on the timestamp column names.\n\nServer-side traceback:\n\n```\nFile \".../feast/feature_server.py\", in write_to_online_store\nFile \".../feast/feature_store.py\", in write_to_online_store\nFile \".../feast/infra/passthrough_provider.py\", in _prep_rows_to_write_for_ingestion\nFile \".../feast/utils.py\", in _convert_arrow_fv_to_proto\nKeyError: 'Field \"created_at\" does not exist in schema'\n```\n\n## Steps to reproduce\n\n1. Define a feature view whose batch source uses non-default timestamp column names,\n e.g. `PostgreSQLSource(timestamp_field=\"event_timestamp\",\n created_timestamp_column=\"created_at\", ...)`.\n2. Point a client at a remote online store: `online_store: { type: remote, path:\n \u003cfeature-server-url\u003e }` (or call the feature server `/write-to-online-store`).\n3. `store.write_to_online_store(fv_name, df=df)` where `df` includes the `created_at`\n column. The client-side conversion succeeds; the server returns HTTP 500 with the\n `KeyError` above. The same write against a local provider succeeds.\n\n### Specifications\n\n- Version: 0.64.0 (client and feature server)\n- Platform: Linux, Python 3.13\n- Subsystem: remote online store (`feast/infra/online_stores/remote.py`) /\n Python feature server `/write-to-online-store` (`feast/feature_server.py`) /\n `_convert_arrow_fv_to_proto` (`feast/utils.py`)\n\n## Possible Solution\n\nIn `RemoteOnlineStore.online_write_batch`, label the timestamp columns using the\nfeature view's configured fields instead of hardcoded literals:\n\n```python\nevent_col = table.batch_source.timestamp_field or \"event_timestamp\"\ncreated_col = table.batch_source.created_timestamp_column or \"created\"\ncolumnar_data[event_col].append(...)\nif created_col:\n columnar_data[created_col].append(...)\n```\n\nAlternatively, have the server map the well-known `event_timestamp` / `created`\nrequest columns onto the FV's configured names before conversion. Fixing the client to\nemit the configured names is the smaller change and keeps the request self-describing.\n","author":{"url":"https://github.com/BigyaPradhan","@type":"Person","name":"BigyaPradhan"},"datePublished":"2026-07-09T17:36:13.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/6595/feast/issues/6595"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:f80dceb8-dc27-a242-15ac-d00a7e761760 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | DCEC:18F0F4:E18C5E:12D7723:6A51BA2A |
| html-safe-nonce | 480ec970a82477df62b2a1ae24ecf6716f1df4145c1f296b8005d88f4eefe415 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEQ0VDOjE4RjBGNDpFMThDNUU6MTJENzcyMzo2QTUxQkEyQSIsInZpc2l0b3JfaWQiOiI3NDI4MTg2MTg4MzU0MjcxNzg2IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | fe8151c124a3065a1d8fcc74e05a44d7dcc1098268d1b773cf5c739219a833c9 |
| hovercard-subject-tag | issue:4848517934 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/feast-dev/feast/6595/issue_layout |
| twitter:image | https://opengraph.githubassets.com/00fd97115b34d6962b7409c448fb794d7b8b03e69e4b2fba55fb595663574146/feast-dev/feast/issues/6595 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/00fd97115b34d6962b7409c448fb794d7b8b03e69e4b2fba55fb595663574146/feast-dev/feast/issues/6595 |
| og:image:alt | Expected Behavior Remote write_to_online_store should round-trip regardless of the feature view's timestamp column names. Writing works for a local provider (the full dataframe is converted in-proc... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | BigyaPradhan |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/feast-dev/feast git https://github.com/feast-dev/feast.git |
| octolytics-dimension-user_id | 57027613 |
| octolytics-dimension-user_login | feast-dev |
| octolytics-dimension-repository_id | 161133770 |
| octolytics-dimension-repository_nwo | feast-dev/feast |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 161133770 |
| octolytics-dimension-repository_network_root_nwo | feast-dev/feast |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 7aed05249554b889eb33d002851a973eebcc7e91 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width