Thanks, Russell, for taking a look at this!

We need to expose four methods on the user-facing API (FormatModelRegistry):

   1. *writeBuilder* – for writing arbitrary files without Iceberg
   metadata. In the Iceberg codebase, this is exposed via
FlinkAppenderFactory and
   the GenericAppenderFactory for creating FileAppender<RowData> and
   FileAppender<Record> only.
   2. *dataWriteBuilder* – for creating and collecting metadata for Iceberg
   DataFiles.
   3. *equalityDeleteWriteBuilder* – for creating and collecting metadata
   for Iceberg EqualityDeleteFiles.
   4. *positionDeleteWriteBuilder* – for creating and collecting metadata
   for Iceberg PositionDeleteFiles.

We’d like to implement all four using a single WriteBuilder created by the
FormatModels.

Your suggestion is a good one—it helps formalize the requirements for the
build method and also surfaces an important design question:

*Who should be responsible for handling the differences between normal rows
(InternalRow) and position deletes (PositionDelete<InternalRow>)*?

   - Should we have a more complex WriteBuilder class that can create both
   DataFileAppender and PositionDeleteAppender?
   - Or should we push this responsibility to the engine-specific code,
   where we already have some logic (e.g., pathTransformFunc) needed by
   each engine to create the PositionDeleteAppender?

Thanks,
Peter


Russell Spitzer <russell.spit...@gmail.com> ezt írta (időpont: 2025. szept.
11., Cs, 0:11):

> I'm a little confused here, I think Ryan mentioned this in the comment
> here https://github.com/apache/iceberg/pull/12774/files#r2254967177
>
> From my understanding there are two options?
>
> 1) We either are producing FormatModels that take a generic row type D and
> produce writers that all take D and write files.
>
> 2) we are creating IcebergModel specific writers that take DataFile,
> PositionDeleteFile, EqualityDeleteFile etc ... and write files
>
> The PositionDelete Converter issue seems to stem from attempting to do
> both model 1 (being very generic) and 2, wanting special code to deal with
> PositionDeleteFile<R> objects.
>
> It looks like the code in #12774 is mostly doing model 1, but we are
> trying to add in a specific converter for 2?
>
> Maybe i'm totally lost here but I was assuming we would do something a
> little scala-y like
>
> public <T> FileAppender<T> build(Class<T> type) {
> if (type == DataFile.class) return (FileAppender<T>) new DataFileAppender
> ();
> if (type == DeleteFile.class) return (FileAppender<T>) new
> DeleteFileAppender();
> // ...
> }
>
>
> So that we only register a single signature and if writer specific
> implementation needs to do something special it can? I'm trying to catch
> back up to speed on this PR so it may help to do a quick summary of the
> current state and intent. (At least for me)
>
> On Tue, Sep 9, 2025 at 3:42 AM Péter Váry <peter.vary.apa...@gmail.com>
> wrote:
>
>> Hi Renjie,
>> Thanks for taking a look!
>>
>> Let me clarify a few points:
>> - The converter API is only required for writing position delete files
>> for V2 tables
>> - Currently, there are no plans to support vectorized writing via the
>> java API
>> - Even if we decide to support vectorized writes, I don't think we would
>> like to implement it for Positional Deletes, which are deprecated in the
>> new spec.
>> - Also, once the positional deletes - which contain the deleted rows -
>> are deprecated (as planned), the conversion of the Position Deletes with
>> only file name and position would be trivial, even for the vectorized
>> writes.
>>
>> So from my perspective, the converter method exists purely for backward
>> compatibility, and we intend to remove it as soon as possible. Sacrificing
>> good practices for the sake of a deprecated feature doesn’t seem worthwhile
>> to me.
>>
>> Thanks,
>> Peter
>>
>> Renjie Liu <liurenjie2...@gmail.com> ezt írta (időpont: 2025. szept. 8.,
>> H, 12:34):
>>
>>> Hi, Peter:
>>>
>>> I would vote for the first approach. In spite of the compromises
>>> described, the api is still cleaner. Also I think there are some problems
>>> with the converter api. For example, for vectorized implementations such as
>>> comet which accepts columnar batch rather than rows, the converter method
>>> would make things more complicated.
>>>
>>> On Sat, Aug 30, 2025 at 2:49 PM Péter Váry <peter.vary.apa...@gmail.com>
>>> wrote:
>>>
>>>> I’ve initiated a discussion thread regarding the deprecation of
>>>> Position Deletes containing row data. You can follow it here:
>>>> https://lists.apache.org/thread/8jw6pb2vq3ghmdqf1yvy8n5n6gg1fq5s
>>>>
>>>> We can proceed with the discussion about the native reader/writer
>>>> deprecation when we decided on the final API, as the chosen design may
>>>> influence our approach.
>>>>
>>>> Since then, one more question has come up - hopefully the last:
>>>> *How should we handle Position Delete Writers?*
>>>> The File Format API should return builders for either rows or
>>>> PositionDelete objects. Currently the method
>>>> `WriteBuilder.createWriterFunc(Function<MessageType,
>>>> ParquetValueWriter<?>>)` defines the accepted input parameters for the
>>>> writer. Users are responsible for ensuring that the writer function and the
>>>> return type of the `WriteBuilder.build()` are compatible. In the new API,
>>>> we no longer expose writer functions. We still expose FileContent, since
>>>> writer configurations vary by content type, but we don’t expose the types.
>>>>
>>>> There are two proposals for handling types for the WriteBuilders:
>>>>
>>>>    1. *Implicit Type Definition via FileContent* - the builder
>>>>    parameter for FileContent would implicitly define the input type for the
>>>>    writer returned by build(), or
>>>>    2. *Engine level conversion* - Engines would convert PositionDelete
>>>>    objects to their native types.
>>>>
>>>> In code:
>>>>
>>>>    - In the 1st proposal, the FormatModel.writeBuilder(OutputFile
>>>>    outputFile) can return anything:
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> *    WriteBuilder builder = FormatModelRegistry.writeBuilder(PARQUET,
>>>>    InternalRow.class, outputFile);     FileAppender<InternalRow> appender =
>>>>          .schema(table.schema())         .content(FileContent.DATA)
>>>>    ....         .build(); *
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> *   // Exposed, but FormatModelRegistry.positionDeleteWriteBuilder
>>>>    should be used instead    WriteBuilder builder
>>>>    = FormatModelRegistry.writeBuilder(PARQUET, InternalRow.class, 
>>>> outputFile);
>>>>       FileAppender<PositionDelete<InternalRow>> appender =
>>>>    .schema(table.schema())         .content(FileContent.POSITION_DELETES)
>>>>        ....         .build();*
>>>>
>>>>
>>>>    - In the 2nd proposal, the FormatModel needs another method:
>>>>
>>>>
>>>>
>>>> *Function<PositionDelete<D>, D> positionDeleteConverter(Schema
>>>> schema);    *example implementation:
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> *    return delete -> {      deleteRecord.update(0,
>>>> UTF8String.fromString(delete.path().toString()));
>>>> deleteRecord.update(1, delete.pos());      deleteRecord.update(2,
>>>> delete.row());      return deleteRecord;    };*
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> *    // Content is only used for writer property configuration
>>>>    WriteBuilder<InternalRow> builder =
>>>>    sparkFormatModel.writeBuilder(outputFile);
>>>>      FileAppender<InternalRow> appender =         .schema(table.schema())
>>>>        .content(FileContent.DATA)         ....         .build();*
>>>>
>>>>
>>>> Drawbacks
>>>>
>>>>    - Proposal 1:
>>>>       - Type checking for the FileAppenders occurs only at runtime, so
>>>>       user errors surface late.
>>>>       - File Format specification must clearly specify which builder
>>>>       type corresponds to which file content parameter—generics would offer
>>>>       better clarity.
>>>>       - Inconsistent patterns between WriteBuilder and ReadBuilder, as
>>>>       the latter can define output types via generics.
>>>>    - Proposal 2:
>>>>       - Requires FormatModels to implement a converter method to
>>>>       transform PositionDelete<InternalRow> into InternalRow.
>>>>
>>>> Since we deprecated writing position delete files in the V3 spec, this
>>>> extra method in the 2nd proposal will be deprecated too. As a result, in
>>>> the long run, we will have a nice, clean API.
>>>> OTOH, if we accept the compromise described in the 1st proposal, the
>>>> results of our decision will remain, even when the functions are removed.
>>>>
>>>> Looking forward to your thoughts.
>>>> Thanks, Peter
>>>>
>>>> On Thu, Aug 14, 2025, 14:12 Péter Váry <peter.vary.apa...@gmail.com>
>>>> wrote:
>>>>
>>>>> Hi Team,
>>>>>
>>>>> During yesterday’s community sync, we discussed the current state of
>>>>> the File Format API proposal and identified two key questions that require
>>>>> input from the broader community:
>>>>>
>>>>> *1. Dropping support for Position Delete files with Row Data*
>>>>>
>>>>> The current Iceberg V2 spec [1] defines two types of position delete
>>>>> files:
>>>>>
>>>>>    - Files that store only the file name and row position.
>>>>>    - Files that also store the deleted row data.
>>>>>
>>>>> Although this feature is defined in the spec and some tests exist in
>>>>> the Iceberg codebase, we’re not aware of any actual implementation using
>>>>> the second type (with row data). Supporting V2 table writing via the new
>>>>> File Format API would be simpler if we dropped support for this feature.
>>>>> If you know of any use case or reason to retain support for position
>>>>> deletes with row data, please let us know.
>>>>>
>>>>> *2. Deprecating Native File Format Readers/Writers in the API*
>>>>>
>>>>> The current API contains format-specific readers/writers for Parquet,
>>>>> Avro, and ORC. With the introduction of the InternalData and File Format
>>>>> APIs, Iceberg users can now write files using:
>>>>>
>>>>>    - InternalData API for metadata files (manifest, manifest list,
>>>>>    partition stats).
>>>>>    - File Format API for data and delete files.
>>>>>
>>>>> I propose we deprecate the original format-specific writers and guide
>>>>> users to use the new APIs based on the target file type. If you’re aware 
>>>>> of
>>>>> any use cases that still require the original format-specific writers,
>>>>> please share them.
>>>>>
>>>>> Thanks,
>>>>> Peter
>>>>>
>>>>> [1] - Position Delete File Spec:
>>>>> https://iceberg.apache.org/spec/?h=delete#position-delete-files
>>>>>
>>>>> Péter Váry <peter.vary.apa...@gmail.com> ezt írta (időpont: 2025.
>>>>> júl. 22., K, 16:09):
>>>>>
>>>>>> Also put together a solution where the Engine specific format
>>>>>> transformation is separated from the writer, and the engines need to take
>>>>>> care of it separately.
>>>>>> This is somewhat complicated on the implementation side (see:
>>>>>> [RowDataTransformer](
>>>>>> https://github.com/apache/iceberg/pull/12298/files#diff-562fa4cc369c908a157f59a9235fd3f389096451e7901686fba37c87b53dee08),
>>>>>> and [InternalRowTransformer](
>>>>>> https://github.com/apache/iceberg/pull/12298/files#diff-546f9dc30e3207d1d2bc0a2722976b55f5a04dcf85a22855e4f400500c317140)),
>>>>>> but simplifies the API.
>>>>>>
>>>>>> @rdblue: Please check the proposed solution. I think this is what you
>>>>>> have suggested
>>>>>>
>>>>>> Péter Váry <peter.vary.apa...@gmail.com> ezt írta (időpont: 2025.
>>>>>> jún. 30., H, 18:42):
>>>>>>
>>>>>>> During the PR review [1], we began exploring what could we use as an
>>>>>>> intermediate layer to reduce the need for engines and file formats to
>>>>>>> implement the full matrix of file format - object model conversions.
>>>>>>>
>>>>>>> To support this discussion, I’ve created and run a set of
>>>>>>> performance benchmarks and compiled a document outlining the potential
>>>>>>> benefits and trade-offs [2].
>>>>>>>
>>>>>>> Feedback is welcome, feel free to comment on the document, the PR,
>>>>>>> or directly in this thread.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Peter
>>>>>>>
>>>>>>> [1] - PR discussion -
>>>>>>> https://github.com/apache/iceberg/pull/12774#discussion_r2093626096
>>>>>>> [2] - File Format and engine object model transformation performance
>>>>>>> -
>>>>>>> https://docs.google.com/document/d/1GdA8IowKMtS3QVdm8s-0X-ZRYetcHv2bhQ9mrSd3fd4
>>>>>>>
>>>>>>> Péter Váry <peter.vary.apa...@gmail.com> ezt írta (időpont: 2025.
>>>>>>> máj. 7., Sze, 13:15):
>>>>>>>
>>>>>>>> Hi everyone,
>>>>>>>> The proposed API part is reviewed and ready to go. See:
>>>>>>>> https://github.com/apache/iceberg/pull/12774
>>>>>>>> Thanks to everyone who reviewed it already!
>>>>>>>>
>>>>>>>> Many of you wanted to review, but I know that the time constraints
>>>>>>>> are there for everyone. I still very much would like to hear your 
>>>>>>>> voices,
>>>>>>>> so I will not merge the PR this week. Please review it if you.
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Peter
>>>>>>>>
>>>>>>>> Péter Váry <peter.vary.apa...@gmail.com> ezt írta (időpont: 2025.
>>>>>>>> ápr. 16., Sze, 7:02):
>>>>>>>>
>>>>>>>>> Hi Renjie,
>>>>>>>>> The first one for the proposed new API is here:
>>>>>>>>> https://github.com/apache/iceberg/pull/12774
>>>>>>>>> Thanks, Peter
>>>>>>>>>
>>>>>>>>> On Wed, Apr 16, 2025, 05:40 Renjie Liu <liurenjie2...@gmail.com>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> Hi, Peter:
>>>>>>>>>>
>>>>>>>>>> Thanks for the effort. I totally agree with splitting them into
>>>>>>>>>> smaller prs to move forward.
>>>>>>>>>>
>>>>>>>>>> I'm quite interested in this topic, and please ping me in those
>>>>>>>>>> splitted prs and I'll help to review.
>>>>>>>>>>
>>>>>>>>>> On Mon, Apr 14, 2025 at 11:22 PM Jean-Baptiste Onofré <
>>>>>>>>>> j...@nanthrax.net> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hi Peter
>>>>>>>>>>>
>>>>>>>>>>> Awesome ! Thank you so much !
>>>>>>>>>>> I will do a new pass.
>>>>>>>>>>>
>>>>>>>>>>> Regards
>>>>>>>>>>> JB
>>>>>>>>>>>
>>>>>>>>>>> On Fri, Apr 11, 2025 at 3:48 PM Péter Váry <
>>>>>>>>>>> peter.vary.apa...@gmail.com> wrote:
>>>>>>>>>>> >
>>>>>>>>>>> > Hi JB,
>>>>>>>>>>> >
>>>>>>>>>>> > Separated out the proposed interfaces to a new PR:
>>>>>>>>>>> https://github.com/apache/iceberg/pull/12774.
>>>>>>>>>>> > Reviewers can check that out if they are only interested in
>>>>>>>>>>> how the new API would look like.
>>>>>>>>>>> >
>>>>>>>>>>> > Thanks,
>>>>>>>>>>> > Peter
>>>>>>>>>>> >
>>>>>>>>>>> > Jean-Baptiste Onofré <j...@nanthrax.net> ezt írta (időpont:
>>>>>>>>>>> 2025. ápr. 10., Cs, 18:25):
>>>>>>>>>>> >>
>>>>>>>>>>> >> Hi Peter
>>>>>>>>>>> >>
>>>>>>>>>>> >> Thanks for the ping about the PR.
>>>>>>>>>>> >>
>>>>>>>>>>> >> Maybe, to facilitate the review and move forward faster, we
>>>>>>>>>>> should
>>>>>>>>>>> >> split the PR in smaller PRs:
>>>>>>>>>>> >> - one with the interfaces (ReadBuilder, AppenderBuilder,
>>>>>>>>>>> ObjectModel,
>>>>>>>>>>> >> AppenderBuilder, DataWriterBuilder, ...)
>>>>>>>>>>> >> - one for each file providers (Parquet, Avro, ORC)
>>>>>>>>>>> >>
>>>>>>>>>>> >> Thoughts ? I can help on the split if needed.
>>>>>>>>>>> >>
>>>>>>>>>>> >> Regards
>>>>>>>>>>> >> JB
>>>>>>>>>>> >>
>>>>>>>>>>> >> On Thu, Apr 10, 2025 at 5:16 AM Péter Váry <
>>>>>>>>>>> peter.vary.apa...@gmail.com> wrote:
>>>>>>>>>>> >> >
>>>>>>>>>>> >> > Since the 1.9.0 release candidate has been created, I would
>>>>>>>>>>> like to resurrect this PR:
>>>>>>>>>>> https://github.com/apache/iceberg/pull/12298 to ensure that we
>>>>>>>>>>> have as long a testing period as possible for it.
>>>>>>>>>>> >> >
>>>>>>>>>>> >> > To recap, here is what the PR does after the review rounds:
>>>>>>>>>>> >> >
>>>>>>>>>>> >> > Created 3 interface classes which are implemented by the
>>>>>>>>>>> file formats:
>>>>>>>>>>> >> >
>>>>>>>>>>> >> > ReadBuilder - Builder for reading data from data files
>>>>>>>>>>> >> > AppenderBuilder - Builder for writing data to data files
>>>>>>>>>>> >> > ObjectModel - Providing ReadBuilders, and AppenderBuilders
>>>>>>>>>>> for the specific data file format and object model pair
>>>>>>>>>>> >> >
>>>>>>>>>>> >> > Updated the Parquet, Avro, ORC implementation for this
>>>>>>>>>>> interfaces, and deprecated the old reader/writer APIs
>>>>>>>>>>> >> > Created interface classes which will be used by the actual
>>>>>>>>>>> readers/writers of the data files:
>>>>>>>>>>> >> >
>>>>>>>>>>> >> > AppenderBuilder - Builder for writing a file
>>>>>>>>>>> >> > DataWriterBuilder - Builder for generating a data file
>>>>>>>>>>> >> > PositionDeleteWriterBuilder - Builder for generating a
>>>>>>>>>>> position delete file
>>>>>>>>>>> >> > EqualityDeleteWriterBuilder - Builder for generating an
>>>>>>>>>>> equality delete file
>>>>>>>>>>> >> > No ReadBuilder here - the file format reader builder is
>>>>>>>>>>> reused
>>>>>>>>>>> >> >
>>>>>>>>>>> >> > Created a WriterBuilder class which implements the
>>>>>>>>>>> interfaces above
>>>>>>>>>>> (AppenderBuilder/DataWriterBuilder/PositionDeleteWriterBuilder/EqualityDeleteWriterBuilder)
>>>>>>>>>>> based on a provided file format specific AppenderBuilder
>>>>>>>>>>> >> > Created an ObjectModelRegistry which stores the available
>>>>>>>>>>> ObjectModels, and engines and users could request the readers 
>>>>>>>>>>> (ReadBuilder)
>>>>>>>>>>> and writers
>>>>>>>>>>> (AppenderBuilder/DataWriterBuilder/PositionDeleteWriterBuilder/EqualityDeleteWriterBuilder)
>>>>>>>>>>> from.
>>>>>>>>>>> >> > Created the appropriate ObjectModels:
>>>>>>>>>>> >> >
>>>>>>>>>>> >> > GenericObjectModels - for reading and writing Iceberg
>>>>>>>>>>> Records
>>>>>>>>>>> >> > SparkObjectModels - for reading (vectorized and
>>>>>>>>>>> non-vectorized) and writing Spark InternalRow/ColumnarBatch objects
>>>>>>>>>>> >> > FlinkObjectModels - for reading and writing Flink RowData
>>>>>>>>>>> objects
>>>>>>>>>>> >> > An arrow object model is also registered for vectorized
>>>>>>>>>>> reads of Parquet files into Arrow ColumnarBatch objects
>>>>>>>>>>> >> >
>>>>>>>>>>> >> > Updated the production code where the reading and writing
>>>>>>>>>>> happens to use the ObjectModelRegistry and the new reader/writer 
>>>>>>>>>>> interfaces
>>>>>>>>>>> to access data files
>>>>>>>>>>> >> > Kept the testing code intact to ensure that the new
>>>>>>>>>>> API/code is not breaking anything
>>>>>>>>>>> >> >
>>>>>>>>>>> >> > The original change was not small, and grew substantially
>>>>>>>>>>> during the review rounds. So if you have questions, or I can do 
>>>>>>>>>>> anything to
>>>>>>>>>>> make the review easier, don't hesitate to ask. I am happy to do 
>>>>>>>>>>> anything to
>>>>>>>>>>> move this forward.
>>>>>>>>>>> >> >
>>>>>>>>>>> >> > Thanks,
>>>>>>>>>>> >> > Peter
>>>>>>>>>>> >> >
>>>>>>>>>>> >> > Péter Váry <peter.vary.apa...@gmail.com> ezt írta
>>>>>>>>>>> (időpont: 2025. márc. 26., Sze, 14:54):
>>>>>>>>>>> >> >>
>>>>>>>>>>> >> >> Hi everyone,
>>>>>>>>>>> >> >>
>>>>>>>>>>> >> >> I have updated the File Format API PR (
>>>>>>>>>>> https://github.com/apache/iceberg/pull/12298) based on the
>>>>>>>>>>> answers and review comments.
>>>>>>>>>>> >> >>
>>>>>>>>>>> >> >> I would like to merge this only after the 1.9.0 release so
>>>>>>>>>>> we have more time finding any issues and solving them before this 
>>>>>>>>>>> goes to a
>>>>>>>>>>> release for the users.
>>>>>>>>>>> >> >>
>>>>>>>>>>> >> >> For this I have updated the deprecation comments
>>>>>>>>>>> accordingly.
>>>>>>>>>>> >> >> I would like to ask you to review the PR, so we iron out
>>>>>>>>>>> any possible requested changes and be ready for the merge as soon as
>>>>>>>>>>> possible after the 1.9.0 release.
>>>>>>>>>>> >> >>
>>>>>>>>>>> >> >> Thanks,
>>>>>>>>>>> >> >> Peter
>>>>>>>>>>> >> >>
>>>>>>>>>>> >> >> Péter Váry <peter.vary.apa...@gmail.com> ezt írta
>>>>>>>>>>> (időpont: 2025. márc. 21., P, 14:32):
>>>>>>>>>>> >> >>>
>>>>>>>>>>> >> >>> Hi Renije,
>>>>>>>>>>> >> >>>
>>>>>>>>>>> >> >>> > 1. File format filters
>>>>>>>>>>> >> >>> >
>>>>>>>>>>> >> >>> > Do the filters include both filter expressions from
>>>>>>>>>>> both user query and delete filter?
>>>>>>>>>>> >> >>>
>>>>>>>>>>> >> >>> The current discussion is about the filters from the user
>>>>>>>>>>> query.
>>>>>>>>>>> >> >>>
>>>>>>>>>>> >> >>> About the delete filter:
>>>>>>>>>>> >> >>> Based on the suggestions on the PR, I have moved the
>>>>>>>>>>> delete filter out from the main API. Created a 
>>>>>>>>>>> `SupportsDeleteFilter`
>>>>>>>>>>> interface for it which would allow pushing down to the filter to 
>>>>>>>>>>> Parquet
>>>>>>>>>>> vectorized readers in Spark, as this is the only place where we 
>>>>>>>>>>> currently
>>>>>>>>>>> implemented this feature.
>>>>>>>>>>> >> >>>
>>>>>>>>>>> >> >>>
>>>>>>>>>>> >> >>> Renjie Liu <liurenjie2...@gmail.com> ezt írta (időpont:
>>>>>>>>>>> 2025. márc. 21., P, 14:11):
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>> Hi, Peter:
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>> Thanks for the effort on this.
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>> 1. File format filters
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>> Do the filters include both filter expressions from both
>>>>>>>>>>> user query and delete filter?
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>> For filters from user query, I agree with you that we
>>>>>>>>>>> should keep the current behavior.
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>> For delete filters associated with data files, at first
>>>>>>>>>>> I thought file format readers should not care about this. But now I
>>>>>>>>>>> realized that maybe we need to also push it to file reader, this is 
>>>>>>>>>>> useful
>>>>>>>>>>> when `IS_DELETED` metadata column is not necessary and we could use 
>>>>>>>>>>> these
>>>>>>>>>>> filters (position deletes, etc) to further prune data.
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>> But anyway, I agree that we could postpone it in follow
>>>>>>>>>>> up pr.
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>> 2. Batch size configuration
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>> I'm leaning toward option 2.
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>> 3. Spark configuration
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>> I'm leaning towards using different configuration
>>>>>>>>>>> objects.
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>>
>>>>>>>>>>> >> >>>> On Thu, Mar 20, 2025 at 10:23 PM Péter Váry <
>>>>>>>>>>> peter.vary.apa...@gmail.com> wrote:
>>>>>>>>>>> >> >>>>>
>>>>>>>>>>> >> >>>>> Hi Team,
>>>>>>>>>>> >> >>>>> Thanks everyone for the reviews on
>>>>>>>>>>> https://github.com/apache/iceberg/pull/12298!
>>>>>>>>>>> >> >>>>> I have addressed most of comments, but a few questions
>>>>>>>>>>> still remain which might merit a bit wider audience:
>>>>>>>>>>> >> >>>>>
>>>>>>>>>>> >> >>>>> We should decide on the expected filtering behavior
>>>>>>>>>>> when the filters are pushed down to the readers. Currently the 
>>>>>>>>>>> filters are
>>>>>>>>>>> applied as best effort for the file format readers. Some readers 
>>>>>>>>>>> (Avro)
>>>>>>>>>>> just skip them altogether. There was a suggestion on the PR that we 
>>>>>>>>>>> might
>>>>>>>>>>> enforce more strict requirements and the readers either reject part 
>>>>>>>>>>> of the
>>>>>>>>>>> filters, or they could apply them fully.
>>>>>>>>>>> >> >>>>> Batch sizes are currently parameters for the reader
>>>>>>>>>>> builders which could be set for non-vectorized readers too which 
>>>>>>>>>>> could be
>>>>>>>>>>> confusing.
>>>>>>>>>>> >> >>>>> Currently the Spark batch reader uses different
>>>>>>>>>>> configuration objects for ParquetBatchReadConf and OrcBatchReadConf 
>>>>>>>>>>> as
>>>>>>>>>>> requested by the reviewers of the Comet PR. There was a suggestion 
>>>>>>>>>>> on the
>>>>>>>>>>> current PR to use a common configuration instead.
>>>>>>>>>>> >> >>>>>
>>>>>>>>>>> >> >>>>> I would be interested in hearing your thoughts about
>>>>>>>>>>> these topics.
>>>>>>>>>>> >> >>>>>
>>>>>>>>>>> >> >>>>> My current take:
>>>>>>>>>>> >> >>>>>
>>>>>>>>>>> >> >>>>> File format filters: I am leaning towards keeping the
>>>>>>>>>>> current laninet behavior. Especially since Bloom filters are not 
>>>>>>>>>>> able to do
>>>>>>>>>>> a full filtering, and are often used as a way to filter out unwanted
>>>>>>>>>>> records. Another option would be to implement a secondary filtering 
>>>>>>>>>>> inside
>>>>>>>>>>> the file formats themselves which I think would cause extra 
>>>>>>>>>>> complexity, and
>>>>>>>>>>> possible code duplication. Whatever the decision here, I would 
>>>>>>>>>>> suggest
>>>>>>>>>>> moving this out to a next PR as the current changeset is big enough 
>>>>>>>>>>> as it
>>>>>>>>>>> is.
>>>>>>>>>>> >> >>>>> Batch size configuration: Currently this is the only
>>>>>>>>>>> property which is different in the batch readers and the 
>>>>>>>>>>> non-vectorized
>>>>>>>>>>> readers. I see 3 possible solutions:
>>>>>>>>>>> >> >>>>>
>>>>>>>>>>> >> >>>>> Create different builders for vectorized and
>>>>>>>>>>> non-vectorized reads - I don't think the current solution is 
>>>>>>>>>>> confusing
>>>>>>>>>>> enough to worth the extra class
>>>>>>>>>>> >> >>>>> We could put this to the reader configuration property
>>>>>>>>>>> set - This could work, but "hide" the possible configuration mode 
>>>>>>>>>>> which is
>>>>>>>>>>> valid for both Parquet and ORC readers
>>>>>>>>>>> >> >>>>> We could keep things as it is now - I would chose this
>>>>>>>>>>> one, but I don't have a strong opinion here
>>>>>>>>>>> >> >>>>>
>>>>>>>>>>> >> >>>>> Spark configuration: TBH, I'm open to bot solution and
>>>>>>>>>>> happy to move to the direction the community decides on
>>>>>>>>>>> >> >>>>>
>>>>>>>>>>> >> >>>>> Thanks,
>>>>>>>>>>> >> >>>>> Peter
>>>>>>>>>>> >> >>>>>
>>>>>>>>>>> >> >>>>> Jean-Baptiste Onofré <j...@nanthrax.net> ezt írta
>>>>>>>>>>> (időpont: 2025. márc. 14., P, 16:31):
>>>>>>>>>>> >> >>>>>>
>>>>>>>>>>> >> >>>>>> Hi Peter
>>>>>>>>>>> >> >>>>>>
>>>>>>>>>>> >> >>>>>> Thanks for the update. I will do a new pass on the PR.
>>>>>>>>>>> >> >>>>>>
>>>>>>>>>>> >> >>>>>> Regards
>>>>>>>>>>> >> >>>>>> JB
>>>>>>>>>>> >> >>>>>>
>>>>>>>>>>> >> >>>>>> On Thu, Mar 13, 2025 at 1:16 PM Péter Váry <
>>>>>>>>>>> peter.vary.apa...@gmail.com> wrote:
>>>>>>>>>>> >> >>>>>> >
>>>>>>>>>>> >> >>>>>> > Hi Team,
>>>>>>>>>>> >> >>>>>> > I have rebased the File Format API proposal (
>>>>>>>>>>> https://github.com/apache/iceberg/pull/12298) to include the
>>>>>>>>>>> new changes needed for the Variant types. I would love to hear your
>>>>>>>>>>> feedback, especially Dan and Ryan, as you were the most active 
>>>>>>>>>>> during our
>>>>>>>>>>> discussions. If I can help in any way to make the review easier, 
>>>>>>>>>>> please let
>>>>>>>>>>> me know.
>>>>>>>>>>> >> >>>>>> > Thanks,
>>>>>>>>>>> >> >>>>>> > Peter
>>>>>>>>>>> >> >>>>>> >
>>>>>>>>>>> >> >>>>>> > Péter Váry <peter.vary.apa...@gmail.com> ezt írta
>>>>>>>>>>> (időpont: 2025. febr. 28., P, 17:50):
>>>>>>>>>>> >> >>>>>> >>
>>>>>>>>>>> >> >>>>>> >> Hi everyone,
>>>>>>>>>>> >> >>>>>> >> Thanks for all of the actionable, relevant feedback
>>>>>>>>>>> on the PR (https://github.com/apache/iceberg/pull/12298).
>>>>>>>>>>> >> >>>>>> >> Updated the code to address most of them. Please
>>>>>>>>>>> check if you agree with the general approach.
>>>>>>>>>>> >> >>>>>> >> If there is a consensus about the general approach,
>>>>>>>>>>> I could. separate out the PR to smaller pieces so we can have an 
>>>>>>>>>>> easier
>>>>>>>>>>> time to review and merge those step-by-step.
>>>>>>>>>>> >> >>>>>> >> Thanks,
>>>>>>>>>>> >> >>>>>> >> Peter
>>>>>>>>>>> >> >>>>>> >>
>>>>>>>>>>> >> >>>>>> >> Jean-Baptiste Onofré <j...@nanthrax.net> ezt írta
>>>>>>>>>>> (időpont: 2025. febr. 20., Cs, 14:14):
>>>>>>>>>>> >> >>>>>> >>>
>>>>>>>>>>> >> >>>>>> >>> Hi Peter
>>>>>>>>>>> >> >>>>>> >>>
>>>>>>>>>>> >> >>>>>> >>> sorry for the late reply on this.
>>>>>>>>>>> >> >>>>>> >>>
>>>>>>>>>>> >> >>>>>> >>> I did a pass on the proposal, it's very
>>>>>>>>>>> interesting and well written.
>>>>>>>>>>> >> >>>>>> >>> I like the DataFile API and definitely worth to
>>>>>>>>>>> discuss all together.
>>>>>>>>>>> >> >>>>>> >>>
>>>>>>>>>>> >> >>>>>> >>> Maybe we can schedule a specific meeting to
>>>>>>>>>>> discuss about DataFile API ?
>>>>>>>>>>> >> >>>>>> >>>
>>>>>>>>>>> >> >>>>>> >>> Thoughts ?
>>>>>>>>>>> >> >>>>>> >>>
>>>>>>>>>>> >> >>>>>> >>> Regards
>>>>>>>>>>> >> >>>>>> >>> JB
>>>>>>>>>>> >> >>>>>> >>>
>>>>>>>>>>> >> >>>>>> >>> On Tue, Feb 11, 2025 at 5:46 PM Péter Váry <
>>>>>>>>>>> peter.vary.apa...@gmail.com> wrote:
>>>>>>>>>>> >> >>>>>> >>> >
>>>>>>>>>>> >> >>>>>> >>> > Hi Team,
>>>>>>>>>>> >> >>>>>> >>> >
>>>>>>>>>>> >> >>>>>> >>> > As mentioned earlier on our Community Sync I am
>>>>>>>>>>> exploring the possibility to define a FileFormat API for accessing
>>>>>>>>>>> different file formats. I have put together a proposal based on my 
>>>>>>>>>>> findings.
>>>>>>>>>>> >> >>>>>> >>> >
>>>>>>>>>>> >> >>>>>> >>> > -------------------
>>>>>>>>>>> >> >>>>>> >>> > Iceberg currently supports 3 different file
>>>>>>>>>>> formats: Avro, Parquet, ORC. With the introduction of Iceberg V3
>>>>>>>>>>> specification many new features are added to Iceberg. Some of these
>>>>>>>>>>> features like new column types, default values require changes at 
>>>>>>>>>>> the file
>>>>>>>>>>> format level. The changes are added by individual developers with 
>>>>>>>>>>> different
>>>>>>>>>>> focus on the different file formats. As a result not all of the 
>>>>>>>>>>> features
>>>>>>>>>>> are available for every supported file format.
>>>>>>>>>>> >> >>>>>> >>> > Also there are emerging file formats like Vortex
>>>>>>>>>>> [1] or Lance [2] which either by specialization, or by applying 
>>>>>>>>>>> newer
>>>>>>>>>>> research results could provide better alternatives for certain 
>>>>>>>>>>> use-cases
>>>>>>>>>>> like random access for data, or storing ML models.
>>>>>>>>>>> >> >>>>>> >>> > -------------------
>>>>>>>>>>> >> >>>>>> >>> >
>>>>>>>>>>> >> >>>>>> >>> > Please check the detailed proposal [3] and the
>>>>>>>>>>> google document [4], and comment there or reply on the dev list if 
>>>>>>>>>>> you have
>>>>>>>>>>> any suggestions.
>>>>>>>>>>> >> >>>>>> >>> >
>>>>>>>>>>> >> >>>>>> >>> > Thanks,
>>>>>>>>>>> >> >>>>>> >>> > Peter
>>>>>>>>>>> >> >>>>>> >>> >
>>>>>>>>>>> >> >>>>>> >>> > [1] - https://github.com/spiraldb/vortex
>>>>>>>>>>> >> >>>>>> >>> > [2] - https://lancedb.github.io/lance/
>>>>>>>>>>> >> >>>>>> >>> > [3] -
>>>>>>>>>>> https://github.com/apache/iceberg/issues/12225
>>>>>>>>>>> >> >>>>>> >>> > [4] -
>>>>>>>>>>> https://docs.google.com/document/d/1sF_d4tFxJsZWsZFCyCL9ZE7YuI7-P3VrzMLIrrTIxds
>>>>>>>>>>> >> >>>>>> >>> >
>>>>>>>>>>>
>>>>>>>>>>

Reply via email to