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 >>>>>> >>>>>