I'm not sure I follow how one could figure out the equality delete row ID
after the fact. Won't I need to use some other primary key identifier and
do a shuffle join to line it up
with existing records?

On Wed, Feb 12, 2025 at 8:57 AM Péter Váry <peter.vary.apa...@gmail.com>
wrote:

> In Flink there are 2 types of CDC streams:
>
>    - Upsert stream - in this case the sink receives only -D (delete), +I
>    (insert) records - In this case we can't differentiate
>    - Retract stream - in this case the sink receives -D (delete), +I
>    (insert), -U (removed by update), +U (added by update) records - In this
>    case we know if a record is updated, so we can assume that there were a
>    previous version for the record
>
> I'm not sure about Kafka though
>
> Steven Wu <stevenz...@gmail.com> ezt írta (időpont: 2025. febr. 12., Sze,
> 15:42):
>
>> > If we want to keep the equality deletes, we might add a marker to the
>> updated row (for example rowId=-1) that this is an update. The reader and
>> the compaction could calculate the correct value.
>>
>> Peter, this is probably not going to work with equality deletes. The
>> writer doesn't really know if it is an insert or update, since it didn't
>> really check if existing data files have the same row key (equality
>> fields). Otherwise, writers can produce position deletes already. Equality
>> deletes are cheap for writers, because there are no need to do any
>> check/join/correlation at all. Equality deletes just blindly claim deletion
>> of any previous rows ( *if there are any*) marked by the equality key.
>>
>>
>> On Tue, Feb 11, 2025 at 10:11 PM Péter Váry <peter.vary.apa...@gmail.com>
>> wrote:
>>
>>> Hi Russell,
>>>
>>> Thanks for bringing this up!
>>> I think equality deletes are not the root of the problem here.
>>>
>>> - If we have a positional delete, and the new row doesn't include the
>>> old rowId, then the lineage info is lost.
>>> - If we have an equality delete, and the new row contains the rowId,
>>> then we have the lineage info
>>>
>>> That said, it is unlikely to have rowId for the new rows for writers
>>> (Flink, Kafka Connect) who are currently using equality deletes for
>>> updates, because of the exact reason they're using equality deletes (has to
>>> defer the lookup for later). Maybe we can add checks for these engines to
>>> warn when they try to write a table which has row lineage enabled.
>>>
>>> If we want to keep the equality deletes, we might add a marker to the
>>> updated row (for example rowId=-1) that this is an update. The reader and
>>> the compaction could calculate the correct value. That said, I think it
>>> would be better to invest in finding a replacement for equality deletes
>>> than investing more in it. Maybe adding Iceberg indexes which would allow
>>> fast lookup and conversion at commit time, or push those indexes to the
>>> file format level?
>>>
>>> Thanks, Peter
>>>
>>>
>>> On Wed, Feb 12, 2025, 06:38 Gang Wu <ust...@gmail.com> wrote:
>>>
>>>> Thanks Steven for the explanation! Yes, you're right that solely
>>>> rewriting delete files does not help.
>>>>
>>>> IIUC, Iceberg is the only table format that does not produce changelog
>>>> files. Is there any chance to recompute the row_id of updated rows by
>>>> tracking changes of the identifier fields between snapshots during the
>>>> rewrite and produce changelog files?
>>>>
>>>> I'm not asking to add changelogs support since it is a large design
>>>> choice. Just want to brainstorm it.
>>>>
>>>> On Wed, Feb 12, 2025 at 11:55 AM Steven Wu <stevenz...@gmail.com>
>>>> wrote:
>>>>
>>>>> I am fine with the proposed spec change. While it "supports/allows"
>>>>> equality deletes, row lineage semantics needn't/can't be maintained
>>>>> properly for equality deletes (compared to position deletes). Gang pointed
>>>>> out a couple issues with the implications. But we have no choice but to
>>>>> live with those implications due to how equality deletes behave.
>>>>>
>>>>> Gang, rewriting equality deletes to position deletes doesn't really
>>>>> help in this case. To have correct lineage, the row update is supposed to
>>>>> have the row_id carried over from the previous row (equality deleted row)
>>>>> during the write phase with equality deletes. Instead, this spec change 
>>>>> now
>>>>> says the updated row is a complete new row with new row_id.
>>>>>
>>>>> On Tue, Feb 11, 2025 at 7:39 PM Gang Wu <ust...@gmail.com> wrote:
>>>>>
>>>>>> Hi Russell,
>>>>>>
>>>>>> Thanks for supporting equality deletes to row lineage!
>>>>>>
>>>>>> > accept that "updates" will be treated as "delete" and "insert"
>>>>>>
>>>>>> I would say that it has obvious drawbacks below (though it is better
>>>>>> than not supported):
>>>>>> 1) updates will be populated differently when outputting changelogs
>>>>>> to users or downstream databases
>>>>>> 2) lead to more computation for incremental processing like
>>>>>> refreshing materialized views
>>>>>>
>>>>>> At the same time, I would like to ask if it would help if we support
>>>>>> rewriting equality deletes to position deletes.
>>>>>> There was an effort but it has been closed:
>>>>>> https://github.com/apache/iceberg/pull/2216
>>>>>>
>>>>>> Best,
>>>>>> Gang
>>>>>>
>>>>>>
>>>>>> On Wed, Feb 12, 2025 at 7:25 AM Russell Spitzer <
>>>>>> russell.spit...@gmail.com> wrote:
>>>>>>
>>>>>>> Hi Y'all,
>>>>>>>
>>>>>>> As we have been working on the row lineage implementation I've been
>>>>>>> reached out to by a few folks
>>>>>>>  in the community who are interested in changing our defined
>>>>>>> behavior around equality deletes.
>>>>>>>
>>>>>>> Currently when Row Lineage is enabled, the spec says to disable
>>>>>>> equality deletes for the table.
>>>>>>>
>>>>>>> In the interest of compatibility with Flink and other Equality
>>>>>>> delete producers, I originally wrote
>>>>>>> that we would simply treat all equality delete based updates as a
>>>>>>> pure insert and
>>>>>>> delete. At the time, some folks thought this was too open and
>>>>>>> worried that it would be poor behavior which
>>>>>>> led to the current restriction.
>>>>>>>
>>>>>>> Now that we are actually implementing I think there have been some
>>>>>>> changes of heart and that we
>>>>>>> should go back to the original design.  I'd like to see if we have
>>>>>>> consensus
>>>>>>> in the community to change the wording back and allow equality
>>>>>>> deletes.
>>>>>>>
>>>>>>> PR: https://github.com/apache/iceberg/pull/12230
>>>>>>>
>>>>>>> The TLDR;
>>>>>>>
>>>>>>> Allow equality deletes with row lineage but accept that "updates"
>>>>>>> will be treated as "delete" and "insert"
>>>>>>>
>>>>>>> Thanks for your time,
>>>>>>> Russ
>>>>>>>
>>>>>>

Reply via email to