https://github.com/apache/iceberg/pull/14002 for revert, I'll post a new PR which try to accommodate the replies on the thread.
On Fri, Sep 5, 2025 at 8:53 AM Ryan Blue <rdb...@gmail.com> wrote: > Would anyone object to reverting this change? I don't think that it makes > accurate statements. For example, I don't think that "not writing out all > columns or not using the latest schema can change the semantics of the data > written" is correct. It is perfectly fine to append with an older schema > and writers do this today. Saying that may "change the semantics of the > data written" makes this much scarier than it actually is. > > I think this confuses cases and errs too strongly on discouraging > reasonable things. It is, of course, bad to use an older schema that drops > columns from rows that are being updated. But that's a problem with the > engine choosing to drop current data columns more than it is a schema > selection issue. > > I think that the right path here is to state that operations should be > bound to the current schema when they are planned. It is okay to continue > producing data with an older schema in currently-running jobs. And we > should call out the behavior of defaults. But I don't think that we should > use language that clearly states what will happen rather than a generic > "may change the semantics of data written". > > On Fri, Sep 5, 2025 at 5:05 AM Nicolae Vartolomei > <n...@nvartolomei.com.invalid> wrote: > >> Quoting the newly added text in the spec: >> >> > Writers must write out all fields with the types specified from a >> schema present in table metadata. Writers should use the latest schema for >> writing. Not writing out all columns or not using the latest schema can >> change the semantics of the data written. The following are possible >> inconsistencies that can be introduced: >> >> Interpreting this for the Iceberg REST Catalog interaction: writers >> should include the assert-current-schema-id requirement when >> committing to a table. Otherwise, inconsistencies may be introduced. I >> might be on a slightly outdated Iceberg build, but from what I can >> see, Spark with Iceberg doesn’t include this requirement during table >> commits (example: >> https://gist.github.com/nvartolomei/2fd6e994d1d9b5d61597c16339100518). >> >> Do we consider this an implementation bug then? >> >> Also, what should a sensible implementation do when the requirement >> fails? Reload table schema and check if new schema is compatible with >> writer schema (i.e. it wouldn't be subject to the possible >> inconsistencies as described by the spec) and otherwise rewrite the >> data? For example rewrite parquet files by adding new all-null fields >> if needed, etc. >> >> On Thu, Sep 4, 2025 at 10:19 PM Micah Kornfield <emkornfi...@gmail.com> >> wrote: >> > >> > Just to follow-up the PR ended up getting merged. In theory, there >> maybe should have been a vote, but unless someone feels strongly or would >> like to fine tune the language further perhaps we can consider the topic >> resolved? >> > >> > On Wed, Aug 27, 2025 at 2:17 PM Micah Kornfield <emkornfi...@gmail.com> >> wrote: >> >> >> >> I opened https://github.com/apache/iceberg/pull/13936 as a draft >> proposal to capture the conversation. >> >> >> >> BTW, I think one area this brings up that I don't think the >> specification handles is changing between nullable and not-nullable fields. >> Outdated schemas have some implications in these cases as well. >> >> >> >> Cheers, >> >> Micah >> >> >> >> On Tue, Aug 26, 2025 at 10:13 AM Micah Kornfield < >> emkornfi...@gmail.com> wrote: >> >>> >> >>> I think the original question is ambiguous. We should probably >> subset this into two questions: >> >>> >> >>> 1. Is it OK to write out an "int" instead of a "long" if the >> writer's schema says the value is a long? >> >>> >> >>> I think the answer here is we recommended not doing so, even though >> it would likely work. >> >>> >> >>> 2. Is it OK to use an older schema for writing? >> >>> >> >>> The consensus on the thread seems to be yes. I'll note that this can >> cause confusing results when the "write-default" [1] value for a column >> changes. We should probably have an implementation note to clarify: >> >>> a. Using a stale schema is allowed >> >>> b. It might cause inconsistent results in the face of multiple >> writers when default values are used. >> >>> >> >>> Thoughts? >> >>> >> >>> Thanks, >> >>> Micah >> >>> >> >>> On Mon, Aug 25, 2025 at 4:59 PM Ryan Blue <rdb...@gmail.com> wrote: >> >>>> >> >>>> I agree with Dan that type promotion should be well-defined. If it's >> a grey area then we should clarify it in the spec. >> >>>> >> >>>> How it works today is that schema evolution always produces a schema >> that can read files written with any older schema. When a type is promoted, >> the new schema can read any older data file, but readers may need to >> promote values like the [int-to-long reader]( >> https://github.com/apache/iceberg/blob/main/parquet/src/main/java/org/apache/iceberg/parquet/ParquetValueReaders.java#L546-L560) >> does. You aren't guaranteed to be able to read new data using an older >> schema, so the latest schema should always be used or you should use the >> schema attached to a snapshot. >> >>>> >> >>>> Because files with older schemas can always be read, it is safe to >> write files with an older schema. This happens fairly regularly, as Steven >> noted, in cases where a writer has a fixed schema and is long-running. >> >>>> >> >>>> Ryan >> >>>> >> >>>> On Thu, Aug 21, 2025 at 5:37 PM Steven Wu <stevenz...@gmail.com> >> wrote: >> >>>>> >> >>>>> > This means that you can have writers using different schema to >> write (use cases include different partitioning or "out-of-date" writers), >> but the data is still valid. >> >>>>> >> >>>>> +1 on Dan's point. Both batch and streaming writers can have stale >> schema. long-running streaming jobs may stay stale for extended periods >> before picking up the new schema during restart. >> >>>>> >> >>>>> On Wed, Aug 20, 2025 at 2:50 PM Daniel Weeks <dwe...@apache.org> >> wrote: >> >>>>>> >> >>>>>> I think I'm going to disagree and argue that it's not really a >> gray area. >> >>>>>> >> >>>>>> Having strict schema evolution rules and how schema's are tracked >> means that there is independence between writer and reader schemas which >> remain compatible due to the evolution rules. >> >>>>>> >> >>>>>> This means that you can have writers using different schema to >> write (use cases include different partitioning or "out-of-date" writers), >> but the data is still valid. >> >>>>>> >> >>>>>> How you promote physical representation during a read/scan >> operation results in a consistent presentation with the read schema. >> >>>>>> >> >>>>>> All of the representations are technically valid. >> >>>>>> >> >>>>>> -Dan >> >>>>>> >> >>>>>> On Mon, Aug 18, 2025 at 7:46 AM Russell Spitzer < >> russell.spit...@gmail.com> wrote: >> >>>>>>> >> >>>>>>> +1 to what Micah said :) sorry about the typo >> >>>>>>> >> >>>>>>> On Mon, Aug 18, 2025 at 9:45 AM Russell Spitzer < >> russell.spit...@gmail.com> wrote: >> >>>>>>>> >> >>>>>>>> +1 to what Micaah , We have never really written rules about >> what is "allowed" in this particular context but since >> >>>>>>>> a reader needs to be able to handle both int/long values for the >> column, there isn't really any danger in writing >> >>>>>>>> new files with the narrower type. If a reader couldn't handle >> this, then type promotion would be impossible. >> >>>>>>>> >> >>>>>>>> I would include all columns in the file, the space requirements >> for an all null column (or all constant column) should >> >>>>>>>> be very small. I believe the reason we original wrote those >> rules in was to avoid folks doing the Hive Style >> >>>>>>>> implicit columns from partition tuple (although we also have >> handling for this.) >> >>>>>>>> >> >>>>>>>> On Sun, Aug 17, 2025 at 11:15 PM Micah Kornfield < >> emkornfi...@gmail.com> wrote: >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> Hi Nic, >> >>>>>>>>> This is IMO a gray area. >> >>>>>>>>> >> >>>>>>>>>> However, is it allowed to commit *new* parquet files with the >> old >> >>>>>>>>>> types (int) and commit them to the table with a table schema >> where >> >>>>>>>>>> types are promoted (long)? >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> IMO I would expect writers to be writing files that are >> consistent with the current metadata, so ideally they would not be written >> with int if it is now long. In general, though in these cases I think most >> readers are robust to reading type promoted files. We should probably >> clarify in the specification. >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>>> Also, is it allowed to commit parquet files, in general, which >> contain >> >>>>>>>>>> only a subset of columns of table schema? I.e. if I know a >> column is >> >>>>>>>>>> all NULLs, can we just skip writing it? >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> As currently worded the spec on writing data files ( >> https://iceberg.apache.org/spec/#writing-data-files) should include all >> columns. Based on column projection rules, however, failing to do so should >> also not cause problems. >> >>>>>>>>> >> >>>>>>>>> Cheers, >> >>>>>>>>> Micah >> >>>>>>>>> >> >>>>>>>>> On Fri, Aug 15, 2025 at 8:45 AM Nicolae Vartolomei >> <n...@nvartolomei.com.invalid> wrote: >> >>>>>>>>>> >> >>>>>>>>>> Hi, >> >>>>>>>>>> >> >>>>>>>>>> I'm implementing an Iceberg writer[^1] and have a question >> about what >> >>>>>>>>>> type promotion actually means as part of schema evolution >> rules. >> >>>>>>>>>> >> >>>>>>>>>> Iceberg spec [specifies][spec-evo] which type promotions are >> allowed. >> >>>>>>>>>> No confusion there. >> >>>>>>>>>> >> >>>>>>>>>> The confusion on my end arises when it comes to actually >> writing i.e. >> >>>>>>>>>> parquet data. Let's take for example the int to long >> promotion. What >> >>>>>>>>>> is actually allowed under this promotion rule? Let me try to >> show what >> >>>>>>>>>> I mean. >> >>>>>>>>>> >> >>>>>>>>>> Obviously if I have a schema-id N with field A of type int and >> table >> >>>>>>>>>> snapshots with this schema then it is possible to update the >> table >> >>>>>>>>>> schema-id to > N where field A now has type long and this new >> schema >> >>>>>>>>>> can read parquet files with the old type. >> >>>>>>>>>> >> >>>>>>>>>> However, is it allowed to commit *new* parquet files with the >> old >> >>>>>>>>>> types (int) and commit them to the table with a table schema >> where >> >>>>>>>>>> types are promoted (long)? >> >>>>>>>>>> >> >>>>>>>>>> Also, is it allowed to commit parquet files, in general, which >> contain >> >>>>>>>>>> only a subset of columns of table schema? I.e. if I know a >> column is >> >>>>>>>>>> all NULLs, can we just skip writing it? >> >>>>>>>>>> >> >>>>>>>>>> Appreciate taking the time to look at this, >> >>>>>>>>>> Nic >> >>>>>>>>>> >> >>>>>>>>>> [spec-evo]: https://iceberg.apache.org/spec/#schema-evolution >> >>>>>>>>>> [^1]: This is for Redpanda to Iceberg native integration >> >>>>>>>>>> (https://github.com/redpanda-data/redpanda). >> >