Rajat
05/25/2026, 11:03 AMStrategy | Non-null incoming | Null incoming (nullHandlingEnabled: true)
-----------+--------------------+-----------------------------------------
IGNORE | Keeps existing | Keeps existing
| (never updates |
| after first |
| insert)
-----------+--------------------+-----------------------------------------
OVERWRITE | Takes new | Framework preserves existing
| | (null skipped before merger)
If this is correct, then:
1. There's no strategy combination that lets a single PARTIAL table support our dual-writer pattern AND propagate intentional NULLs from source. The two requirements collide on how "incoming null" is interpreted.
2. IGNORE is unusable for any column that ever needs to update — feels less like "ignore" and more like "freeze after first insert."
3. OVERWRITE + nullHandlingEnabled: true is effectively "OVERWRITE_NON_NULL" — useful, but it means partial-upsert can't intentionally clear a column to null.
Questions:
1. Is the table above the documented intended behavior, or am I missing a config knob?
2. Is there a known pattern in Pinot for "update on non-null AND clear to null when source genuinely cleared"? (Other than nullHandlingEnabled: false, which loses Avro null semantics globally.)
3. Any plan for a null-aware variant strategy in upcoming releases?
We've reverted to FULL upsert for our prod path. Just want to make sure I'm not under-using PARTIAL.
Thanks 🙏
C.C: @Mayank @Xiang Fu @JackieXiang Fu
Rajat
06/03/2026, 7:39 AMXiang Fu