Build1 publisher2 min readPublished
UpdateRecord moves Feature Store's merge from your pipeline into the service
AWS says the GetRecord before every PutRecord was burning read capacity and losing concurrent updates. UpdateRecord removes that call, though the post prices nothing and Standard tier feature groups need a new serialization format first.
The Engineer · Build desk

What happened
- Amazon SageMaker Feature Store now accepts an UpdateRecord call that sets one or more named feature values on an existing record without reading or rewriting the rest of it.
- Refreshing one feature previously meant a GetRecord for the complete record, a merge in application code, and a PutRecord that wrote every feature back.
- The service validates IAM permissions, checks EventTime ordering to reject stale writes, and merges the supplied values atomically into the stored record.
- UpdateRecord is not an upsert, so the record named by the identifier has to exist before the call is made.
- Existing In-Memory feature groups backed by ElastiCache support feature-level writes as they are, while Standard tier feature groups require a new storage format called Standard_V2.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- cost AWS ties the saving to read capacity units burned by the pre-write GetRecord, so anyone sizing the win has to model it from their own update rate and record width.
- constraint Since the call refuses to create records, the full-record PutRecord path stays in every writer, along with the logic that decides which of the two a given record needs.
- exposure Batched partial writes need retry handling, because a stale EventTime rejects the whole call with a 409 rather than only the offending value.
- capability Separate clickstream, purchase and scoring pipelines can now own disjoint features on one record without a lock or a single designated writer.
Feature Store still has to know the whole record. Every partial write is followed by a full record snapshot replicated to the offline store, which is how AWS keeps training datasets accurate [8], and the merge is applied against the values already stored, with anything you left out preserved as-is [6]. The read-modify-write moved out of your application code and into the service [3][1].
AWS names the old failure mode in the post: a classic lost-update problem, where two pipelines refresh different features on the same record and one write silently overwrites the other [4]. It earned the name honestly, since doing the merge in application code is the usual way to acquire it.
Per single-feature refresh, the caller goes from two online-store calls to one [3][1], a 50 percent cut in operations per update [18]. AWS attributes the old overhead to read capacity units consumed by the extra GetRecord, and scopes the benefit to customers with wide feature groups and high update frequencies [5]. The post carries no measured latency and no RCU counts [17]. For that saving to land on your bill, single-feature refreshes have to dominate your write mix, and records have to be wide enough that shipping every feature on every update was a real line item. What the service charges for the merge it now performs internally is also absent from the material [17].
Standard_V2 is described as a different serialization format for the Standard tier [14], which puts the adoption cost at the storage layer rather than in an SDK bump; the available text ends at that requirement without saying how an existing feature group reaches the new format [20].
Two edges are worth reading before sizing the change. A single call carries at most 100 feature values [11], so a feature group wider than 100 features cannot be rewritten in full by one UpdateRecord [19]. And TtlDuration only applies when the same call also carries an EventTime [12].
Halving the call count is the easy part [18]. Deciding whether a serialization format change is worth it for that is the review question [14].
What to watch
- Documentation showing how an existing Standard tier feature group reaches Standard_V2, in place or by rebuild and backfill.
- Published latency and read capacity numbers for UpdateRecord against the GetRecord-plus-PutRecord path at a stated record width.
- A conditional create or upsert mode, which would let a writer retire its PutRecord path entirely.