Hi

My understanding was last time it was still unresolved, and the action item
was on Jack and/or/ Jan to make a shorter document.  I think the debate now
has boiled down to Ryan's three options:

   1. separate table/view
   2. combination of table/view tied together via commit
   3. new metadata type

 with probably the first and third being the main contenders. My
understanding was we wanted a table of pros/cons between (1) and (3),
presumably giving folks a chance to address the cons, before the next
meeting.

Jack (main proponent of option (3) just went on paternity leave, so not
sure if there was someone from Amazon with some context of Jack's thought
to continue that train of thought though?  Otherwise maybe Jan can give it
a shot?  Else I will be out and can't make the next iceberg sync, but can
prepare one for the one after that, if needed.

Re: 'new' proposal', not sure if we are ready for a formal one, given the
deadlock between the two options, but Im open to that as well to make a
proposal based on one of the options above.  What do folks think?

Thanks,
Szehon

On Fri, Mar 22, 2024 at 3:15 AM Renjie Liu <liurenjie2...@gmail.com> wrote:

> +1
>
> On Fri, Mar 22, 2024 at 16:42 Jean-Baptiste Onofré <j...@nanthrax.net>
> wrote:
>
>> Hi Renjie,
>>
>> We discussed the MV proposal, without yet reaching any conclusion.
>>
>> I propose:
>> - to use the "new" proposal process in place (creating an GH issue with
>> proposal flag, with link to the document)
>> - use the document and/or GH issue to add comments
>> - finalize the document heading to a vote (to get consensus)
>>
>> Thoughts ?
>>
>> NB: I will follow up with "stale PR/proposal" PR to be sure we are moving
>> forward ;)
>>
>> Regards
>> JB
>>
>> On Fri, Mar 22, 2024 at 4:29 AM Renjie Liu <liurenjie2...@gmail.com>
>> wrote:
>>
>>> Hi:
>>>
>>> Sorry I didn't make it to join the last community sync. Did we reach any
>>> conclusion about mv spec?
>>>
>>> On Tue, Mar 5, 2024 at 11:28 PM himadri pal <meh...@gmail.com> wrote:
>>>
>>>> For me the calendar link did not work in mobile, but I was able to add
>>>> the dev Google calendar from
>>>> https://iceberg.apache.org/community/#iceberg-community-events by
>>>> accessing it from  laptop.
>>>>
>>>> Regards,
>>>> Himadri Pal
>>>>
>>>>
>>>> On Mon, Mar 4, 2024 at 4:43 PM Walaa Eldin Moustafa <
>>>> wa.moust...@gmail.com> wrote:
>>>>
>>>>> Thanks Jack! I think the images are stripped from the message, but
>>>>> they are there on the doc
>>>>> <https://docs.google.com/spreadsheets/d/1a0tlyh8f2ft2SepE7H3bgoY2A0q5IILgzAsJMnwjTBs/edit#gid=0>
>>>>>  if
>>>>> someone wants to check them out (I have left some comments while there).
>>>>>
>>>>> Also I no longer see the community sync calendar
>>>>> https://iceberg.apache.org/community/#slack, so it is unclear when
>>>>> the meeting is (and we do not have the link).
>>>>>
>>>>> Thanks,
>>>>> Walaa.
>>>>>
>>>>>
>>>>> On Mon, Mar 4, 2024 at 9:58 AM Jack Ye <yezhao...@gmail.com> wrote:
>>>>>
>>>>>> Thanks Jan! +1 for everyone to take a look before the discussion, and
>>>>>> see if there are any missing options or major arguments.
>>>>>>
>>>>>> I have also added the images regarding all the options, it might be
>>>>>> easier to parse than the big sheet. I will also put it here for people 
>>>>>> that
>>>>>> do not have time to read through it:
>>>>>>
>>>>>>
>>>>>> *Option 1: Add storage table identifier in view metadata content*
>>>>>>
>>>>>> [image: MV option 1.png]
>>>>>> *Option 2: Add storage table metadata file pointer in view object*
>>>>>>
>>>>>> [image: MV option 2.png]
>>>>>> *Option 3: Add storage table metadata file pointer in view metadata
>>>>>> content*
>>>>>>
>>>>>> [image: MV option 3.png]
>>>>>>
>>>>>> *Option 4: Embed table metadata in view metadata content*
>>>>>>
>>>>>> [image: MV option 4.png]
>>>>>> *Option 5: New MV spec, MV object has table and view metadata file
>>>>>> pointers*
>>>>>>
>>>>>> [image: MV option 5.png]
>>>>>> *Option 6: New MV spec, MV metadata content embeds table and view
>>>>>> metadata*
>>>>>>
>>>>>> [image: MV option 6.png]
>>>>>> *Option 7: New MV spec, completely new MV metadata content*
>>>>>>
>>>>>> [image: MV option 7.png]
>>>>>>
>>>>>> -Jack
>>>>>>
>>>>>>
>>>>>> On Sun, Mar 3, 2024 at 11:45 PM Jan Kaul <jank...@mailbox.org.invalid>
>>>>>> wrote:
>>>>>>
>>>>>>> I think it's great to have a face to face discussion about this.
>>>>>>> Additionally, I would propose to use Jacks' document
>>>>>>> <https://docs.google.com/spreadsheets/d/1a0tlyh8f2ft2SepE7H3bgoY2A0q5IILgzAsJMnwjTBs/edit#gid=0>
>>>>>>> as a common ground for the discussion and that everyone has a quick look
>>>>>>> before the next community sync. If you think the document is still 
>>>>>>> missing
>>>>>>> some arguments, please make suggestions to add them. This way we have to
>>>>>>> spend less time to get everyone up to speed and have a more common
>>>>>>> terminology.
>>>>>>>
>>>>>>> Looking forward to the discussion, best wishes
>>>>>>>
>>>>>>> Jan
>>>>>>> On 02.03.24 02:06, Walaa Eldin Moustafa wrote:
>>>>>>>
>>>>>>> The calendar on the site is currently broken
>>>>>>> https://iceberg.apache.org/community/#iceberg-community-events.
>>>>>>> Might help to fix it or share the meeting link here.
>>>>>>>
>>>>>>> On Fri, Mar 1, 2024 at 3:43 PM Jack Ye <yezhao...@gmail.com> wrote:
>>>>>>>
>>>>>>>> Sounds good, let's discuss this in person!
>>>>>>>>
>>>>>>>> I am a bit worried that we have quite a few critical topics going
>>>>>>>> on right now on devlist, and this will take up a lot of time to 
>>>>>>>> discuss. If
>>>>>>>> it ends up going for too long, l propose let us have a dedicated 
>>>>>>>> meeting,
>>>>>>>> and I am more than happy to organize it.
>>>>>>>>
>>>>>>>> Best,
>>>>>>>> Jack Ye
>>>>>>>>
>>>>>>>> On Fri, Mar 1, 2024 at 12:48 PM Ryan Blue <b...@tabular.io> wrote:
>>>>>>>>
>>>>>>>>> Hey everyone,
>>>>>>>>>
>>>>>>>>> I think this thread has hit a point of diminishing returns and
>>>>>>>>> that we still don't have a common understanding of what the options 
>>>>>>>>> under
>>>>>>>>> consideration actually are.
>>>>>>>>>
>>>>>>>>> Since we were already planning on discussing this at the next
>>>>>>>>> community sync, I suggest we pick this up there and use that time to 
>>>>>>>>> align
>>>>>>>>> on what exactly we're considering. We can then start a new thread to 
>>>>>>>>> lay
>>>>>>>>> out the designs under consideration in more detail and then have a
>>>>>>>>> discussion about trade-offs.
>>>>>>>>>
>>>>>>>>> Does that sound reasonable?
>>>>>>>>>
>>>>>>>>> Ryan
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Fri, Mar 1, 2024 at 11:09 AM Walaa Eldin Moustafa <
>>>>>>>>> wa.moust...@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>> I am finding it hard to interpret the options concretely. I would
>>>>>>>>>> also suggest breaking the expectation/outcome to milestones. Maybe it
>>>>>>>>>> becomes easier if we agree to distinguish between an approach that is
>>>>>>>>>> feasible in the near term and another in the long term, especially 
>>>>>>>>>> if the
>>>>>>>>>> latter requires significant engine-side changes.
>>>>>>>>>>
>>>>>>>>>> Further, maybe it helps if we start with an option that fully
>>>>>>>>>> reuses the existing spec, and see how we view it in comparison with 
>>>>>>>>>> the
>>>>>>>>>> options discussed previously. I am sharing one below. It reuses the 
>>>>>>>>>> current
>>>>>>>>>> spec of Iceberg views and tables by leveraging table properties to 
>>>>>>>>>> capture
>>>>>>>>>> materialized view metadata. What is common (and not common) between 
>>>>>>>>>> this
>>>>>>>>>> and the desired representations?
>>>>>>>>>>
>>>>>>>>>> The new properties are:
>>>>>>>>>> Properties on a View:
>>>>>>>>>>
>>>>>>>>>>    1.
>>>>>>>>>>
>>>>>>>>>>    *iceberg.materialized.view*:
>>>>>>>>>>    - *Type*: View property
>>>>>>>>>>       - *Purpose*: This property is used to mark whether a view
>>>>>>>>>>       is a materialized view. If set to true, the view is
>>>>>>>>>>       treated as a materialized view. This helps in differentiating 
>>>>>>>>>> between
>>>>>>>>>>       virtual and materialized views within the catalog and dictates 
>>>>>>>>>> specific
>>>>>>>>>>       handling and validation logic for materialized views.
>>>>>>>>>>    2.
>>>>>>>>>>
>>>>>>>>>>    *iceberg.materialized.view.storage.location*:
>>>>>>>>>>    - *Type*: View property
>>>>>>>>>>       - *Purpose*: Specifies the location of the storage table
>>>>>>>>>>       associated with the materialized view. This property is used 
>>>>>>>>>> for linking a
>>>>>>>>>>       materialized view with its corresponding storage table, 
>>>>>>>>>> enabling data
>>>>>>>>>>       management and query execution based on the stored data 
>>>>>>>>>> freshness.
>>>>>>>>>>
>>>>>>>>>> Properties on a Table:
>>>>>>>>>>
>>>>>>>>>>    1. *base.snapshot.[UUID]*:
>>>>>>>>>>       - *Type*: Table property
>>>>>>>>>>       - *Purpose*: These properties store the snapshot IDs of
>>>>>>>>>>       the base tables at the time the materialized view's data was 
>>>>>>>>>> last updated.
>>>>>>>>>>       Each property is prefixed with base.snapshot. followed by
>>>>>>>>>>       the UUID of the base table. They are used to track whether the 
>>>>>>>>>> materialized
>>>>>>>>>>       view's data is up to date with the base tables by comparing 
>>>>>>>>>> these snapshot
>>>>>>>>>>       IDs with the current snapshot IDs of the base tables. If all 
>>>>>>>>>> the base
>>>>>>>>>>       tables' current snapshot IDs match the ones stored in these 
>>>>>>>>>> properties, the
>>>>>>>>>>       materialized view's data is considered fresh.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Walaa.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Fri, Mar 1, 2024 at 9:15 AM Jack Ye <yezhao...@gmail.com>
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> > All of these approaches are aligned in one, specific way: the
>>>>>>>>>>> storage table is an iceberg table.
>>>>>>>>>>>
>>>>>>>>>>> I do not think that is true. I think people are aligned that we
>>>>>>>>>>> would like to re-use the Iceberg table metadata defined in the 
>>>>>>>>>>> Iceberg
>>>>>>>>>>> table spec to express the data in MV, but I don't think it goes 
>>>>>>>>>>> that far to
>>>>>>>>>>> say it must be an Iceberg table. Once you have that mindset, then 
>>>>>>>>>>> of course
>>>>>>>>>>> option 1 (separate table and view) is the only option.
>>>>>>>>>>>
>>>>>>>>>>> > I don't think that is necessary and it significantly increases
>>>>>>>>>>> the complexity.
>>>>>>>>>>>
>>>>>>>>>>> And can you quantify what you mean by "significantly increases
>>>>>>>>>>> the complexity"? Seems like a lot of concerns are coming from the 
>>>>>>>>>>> tradeoff
>>>>>>>>>>> with complexity. We probably all agree that using option 7 (a 
>>>>>>>>>>> completely
>>>>>>>>>>> new metadata type) is a lot of work from scratch, that is why it is 
>>>>>>>>>>> not
>>>>>>>>>>> favored. However, my understanding is that as long as we re-use the 
>>>>>>>>>>> view
>>>>>>>>>>> and table metadata, then the majority of the existing logic can be 
>>>>>>>>>>> reused.
>>>>>>>>>>> I think what we have gone through in Slack to draft the rough Java 
>>>>>>>>>>> API
>>>>>>>>>>> shape helps here, because people can estimate the amount of effort 
>>>>>>>>>>> required
>>>>>>>>>>> to implement it. And I don't think they are **significantly** more 
>>>>>>>>>>> complex
>>>>>>>>>>> to implement. Could you elaborate more about the complexity that you
>>>>>>>>>>> imagine?
>>>>>>>>>>>
>>>>>>>>>>> -Jack
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Fri, Mar 1, 2024 at 8:57 AM Daniel Weeks <
>>>>>>>>>>> daniel.c.we...@gmail.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> I feel I've been most vocal about pushing back against options
>>>>>>>>>>>> 2+ (or Ryan's categories of combined table/view, or new metadata 
>>>>>>>>>>>> type), so
>>>>>>>>>>>> I'll try to expand on my reasoning.
>>>>>>>>>>>>
>>>>>>>>>>>> I understand the appeal of creating a design where we
>>>>>>>>>>>> encapsulate the view/storage from both a structural and performance
>>>>>>>>>>>> standpoint, but I don't think that is necessary and it
>>>>>>>>>>>> significantly increases the complexity.
>>>>>>>>>>>>
>>>>>>>>>>>> All of these approaches are aligned in one, specific way: the
>>>>>>>>>>>> storage table is an iceberg table.
>>>>>>>>>>>>
>>>>>>>>>>>> Because of this, all the behaviors and requirements still apply
>>>>>>>>>>>> to these tables.  They need to be maintained (snapshot cleanup, 
>>>>>>>>>>>> orphan
>>>>>>>>>>>> files), in cases need to be optimized (compaction, manifest 
>>>>>>>>>>>> rewrites), they
>>>>>>>>>>>> need to be able to be inspected (this will be even more important 
>>>>>>>>>>>> with MV
>>>>>>>>>>>> since staleness can produce different results and questions will 
>>>>>>>>>>>> arise
>>>>>>>>>>>> about what state the storage table was in).  There may be cases 
>>>>>>>>>>>> where the
>>>>>>>>>>>> tables need to be managed directly.
>>>>>>>>>>>>
>>>>>>>>>>>> Anywhere we deviate from the existing constructs/commit/access
>>>>>>>>>>>> for tables, we will ultimately have to then unwrap to re-expose the
>>>>>>>>>>>> underlying Iceberg behavior.  This creates unnecessary complexity 
>>>>>>>>>>>> in the
>>>>>>>>>>>> library/API layer, which are not the primary interface users will 
>>>>>>>>>>>> have with
>>>>>>>>>>>> materialized views where an engine is almost entirely necessary to 
>>>>>>>>>>>> interact
>>>>>>>>>>>> with the dataset.
>>>>>>>>>>>>
>>>>>>>>>>>> As to the performance concerns around option 1, I think we're
>>>>>>>>>>>> overstating the downsides.  It really comes down to how many 
>>>>>>>>>>>> metadata loads
>>>>>>>>>>>> are necessary and evaluating freshness would likely be the real 
>>>>>>>>>>>> bottleneck
>>>>>>>>>>>> as it involves potentially loading many tables.  All of the 
>>>>>>>>>>>> options are on
>>>>>>>>>>>> the same order of performance for the metadata and table loads.
>>>>>>>>>>>>
>>>>>>>>>>>> As to the visibility of tables and whether they're registered
>>>>>>>>>>>> in the catalog, I think registering in the catalog is the right 
>>>>>>>>>>>> approach so
>>>>>>>>>>>> that the tables are still addressable for maintenance/etc.  The 
>>>>>>>>>>>> visibility
>>>>>>>>>>>> of the storage table is a catalog implementation decision and 
>>>>>>>>>>>> shouldn't be
>>>>>>>>>>>> a requirement of the MV spec (I can see cases for both and it isn't
>>>>>>>>>>>> necessary to dictate a behavior).
>>>>>>>>>>>>
>>>>>>>>>>>> I'm still strongly in favor of Option 1 (separate table and
>>>>>>>>>>>> view) for these reasons.
>>>>>>>>>>>>
>>>>>>>>>>>> -Dan
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Thu, Feb 29, 2024 at 11:07 PM Jack Ye <yezhao...@gmail.com>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> > Jack, it sounds like you’re the proponent of a combined
>>>>>>>>>>>>> table and view (rather than a new metadata spec for a 
>>>>>>>>>>>>> materialized view).
>>>>>>>>>>>>> What is the main motivation? It seems like you’re convinced of 
>>>>>>>>>>>>> that
>>>>>>>>>>>>> approach, but I don’t understand the advantage it brings.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Sorry I have to make a Google Sheet to capture all the options
>>>>>>>>>>>>> we have discussed so far, I wanted to use the existing Google 
>>>>>>>>>>>>> Doc, but it
>>>>>>>>>>>>> has really bad table/sheet support...
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> https://docs.google.com/spreadsheets/d/1a0tlyh8f2ft2SepE7H3bgoY2A0q5IILgzAsJMnwjTBs/edit#gid=0
>>>>>>>>>>>>>
>>>>>>>>>>>>> I have listed all the options, with how they are implemented
>>>>>>>>>>>>> and some important considerations we have discussed so far. Note 
>>>>>>>>>>>>> that:
>>>>>>>>>>>>> 1. This sheet currently excludes the lineage information,
>>>>>>>>>>>>> which we can discuss more later after the current topic is 
>>>>>>>>>>>>> resolved.
>>>>>>>>>>>>> 2. I removed the considerations for REST integration since
>>>>>>>>>>>>> from the other thread we have clarified that they should be 
>>>>>>>>>>>>> considered
>>>>>>>>>>>>> completely separately.
>>>>>>>>>>>>>
>>>>>>>>>>>>> *Why I come as a proponent of having a new MV object with
>>>>>>>>>>>>> table and view metadata file pointer*
>>>>>>>>>>>>>
>>>>>>>>>>>>> In my sheet, there are 3 options that do not have major
>>>>>>>>>>>>> problems:
>>>>>>>>>>>>> Option 2: Add storage table metadata file pointer in view
>>>>>>>>>>>>> object
>>>>>>>>>>>>> Option 5: New MV object with table and view metadata file
>>>>>>>>>>>>> pointer
>>>>>>>>>>>>> Option 6: New MV spec with table and view metadata
>>>>>>>>>>>>>
>>>>>>>>>>>>> I originally excluded option 2 because I think it does not
>>>>>>>>>>>>> align with the REST spec, but after the other discussion thread 
>>>>>>>>>>>>> about "Inconsistency
>>>>>>>>>>>>> between REST spec and table/view spec", I think my original 
>>>>>>>>>>>>> concern no
>>>>>>>>>>>>> longer holds true so now I put it back. And based on my
>>>>>>>>>>>>> personal preference that MV is an independent object that should 
>>>>>>>>>>>>> be
>>>>>>>>>>>>> separated from view and table, plus the fact that option 5 is 
>>>>>>>>>>>>> probably less
>>>>>>>>>>>>> work than option 6 for implementation, that is how I come as a 
>>>>>>>>>>>>> proponent of
>>>>>>>>>>>>> option 5 at this moment.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> *Regarding Ryan's evaluation framework *
>>>>>>>>>>>>>
>>>>>>>>>>>>> I think we need to reconcile this sheet with Ryan's evaluation
>>>>>>>>>>>>> framework. That framework categorization puts option 2, 3, 4, 5, 
>>>>>>>>>>>>> 6 all
>>>>>>>>>>>>> under the same category of "A combination of a view and a
>>>>>>>>>>>>> table" and concludes that they don't have any advantage for the 
>>>>>>>>>>>>> same set of
>>>>>>>>>>>>> reasons. But those reasons are not really convincing to me so 
>>>>>>>>>>>>> let's talk
>>>>>>>>>>>>> about them in more detail.
>>>>>>>>>>>>>
>>>>>>>>>>>>> (1) You said "I don’t see a reason why a combined view and
>>>>>>>>>>>>> table is advantageous" as "this would cause unnecessary 
>>>>>>>>>>>>> dependence between
>>>>>>>>>>>>> the view and table in catalogs."  What dependency exactly do you 
>>>>>>>>>>>>> mean here?
>>>>>>>>>>>>> And why is that unnecessary, given there has to be some sort of 
>>>>>>>>>>>>> dependency
>>>>>>>>>>>>> anyway unless we go with option 5 or 6?
>>>>>>>>>>>>>
>>>>>>>>>>>>> (2) You said "I guess there’s an argument that you could load
>>>>>>>>>>>>> both table and view metadata locations at the same time. That 
>>>>>>>>>>>>> hardly seems
>>>>>>>>>>>>> worth the trouble". I disagree with that. Catalog interaction 
>>>>>>>>>>>>> performance
>>>>>>>>>>>>> is critical to at least everyone working in EMR and Athena, and 
>>>>>>>>>>>>> MV itself
>>>>>>>>>>>>> as an acceleration approach needs to be as fast as possible.
>>>>>>>>>>>>>
>>>>>>>>>>>>> I have put 3 key operations in the doc that I think matters
>>>>>>>>>>>>> for MV during interactions with engine:
>>>>>>>>>>>>> 1. refreshes storage table
>>>>>>>>>>>>> 2. get the storage table of the MV
>>>>>>>>>>>>> 3. if stale, get the view SQL
>>>>>>>>>>>>>
>>>>>>>>>>>>> And option 1 clearly falls short with 4 sequential steps
>>>>>>>>>>>>> required to load a storage table. You mentioned "recent issues 
>>>>>>>>>>>>> with adding
>>>>>>>>>>>>> views to the JDBC catalog" in this topic, could you explain a bit 
>>>>>>>>>>>>> more?
>>>>>>>>>>>>>
>>>>>>>>>>>>> (3) You said "I also think that once we decide on structure,
>>>>>>>>>>>>> we can make it possible for REST catalog implementations to do 
>>>>>>>>>>>>> smart
>>>>>>>>>>>>> things, in a way that doesn’t put additional requirements on the 
>>>>>>>>>>>>> underlying
>>>>>>>>>>>>> catalog store." If REST is fully compatible with Iceberg spec 
>>>>>>>>>>>>> then I have
>>>>>>>>>>>>> no problem with this statement. However, as we discussed in the 
>>>>>>>>>>>>> other
>>>>>>>>>>>>> thread, it is not the case. In the current state, I think the 
>>>>>>>>>>>>> sequence of
>>>>>>>>>>>>> action should be to evolve the Iceberg table/view spec (or add a 
>>>>>>>>>>>>> MV spec)
>>>>>>>>>>>>> first, and then think about how REST can incorporate it or do 
>>>>>>>>>>>>> smart things
>>>>>>>>>>>>> that are not Iceberg spec compliant. Do you agree with that?
>>>>>>>>>>>>>
>>>>>>>>>>>>> (4) You said the table identifier pointer "is a problem we
>>>>>>>>>>>>> need to solve generally because a materialized table needs to be 
>>>>>>>>>>>>> able to
>>>>>>>>>>>>> track the upstream state of tables that were used". I don't think 
>>>>>>>>>>>>> that is a
>>>>>>>>>>>>> reason to choose to use a table identifier pointer for a storage 
>>>>>>>>>>>>> table. The
>>>>>>>>>>>>> issue is not about using a table identifier pointer. It is about 
>>>>>>>>>>>>> exposing
>>>>>>>>>>>>> the storage table as a separate entity in the catalog, which is 
>>>>>>>>>>>>> what people
>>>>>>>>>>>>> do not like and is already discussed in length in Jan's question 
>>>>>>>>>>>>> 3 (also
>>>>>>>>>>>>> linked in the sheet). I agree with that statement, because 
>>>>>>>>>>>>> without a REST
>>>>>>>>>>>>> implementation that can magically hide the storage table, this 
>>>>>>>>>>>>> model adds
>>>>>>>>>>>>> additional burden regarding compliance and data governance for 
>>>>>>>>>>>>> any other
>>>>>>>>>>>>> non-REST catalog implementations that are compliant to the 
>>>>>>>>>>>>> Iceberg spec.
>>>>>>>>>>>>> Many mechanisms need to be built in a catalog to hide, protect, 
>>>>>>>>>>>>> maintain,
>>>>>>>>>>>>> recycle the storage table, that can be avoided by using other 
>>>>>>>>>>>>> approaches. I
>>>>>>>>>>>>> think we should reach a consensus about that and discuss further 
>>>>>>>>>>>>> if you do
>>>>>>>>>>>>> not agree.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Best,
>>>>>>>>>>>>> Jack Ye
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Thu, Feb 29, 2024 at 10:53 PM Jan Kaul
>>>>>>>>>>>>> <jank...@mailbox.org.invalid> <jank...@mailbox.org.invalid>
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hi Ryan, we actually discussed your categories in this
>>>>>>>>>>>>>> question
>>>>>>>>>>>>>> <https://docs.google.com/document/d/1UnhldHhe3Grz8JBngwXPA6ZZord1xMedY5ukEhZYF-A/edit?pli=1#heading=h.y70rtfhi9qxi>.
>>>>>>>>>>>>>> Where your categories correspond to the following designs:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>    - Separate table and view => Design 1
>>>>>>>>>>>>>>    - Combination of view and table => Design 2
>>>>>>>>>>>>>>    - A new metadata type => Design 4
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Jan
>>>>>>>>>>>>>> On 01.03.24 00:03, Ryan Blue wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Looks like it wasn’t clear what I meant for the 3 categories,
>>>>>>>>>>>>>> so I’ll be more specific:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>    - *Separate table and view*: this option is to have the
>>>>>>>>>>>>>>    objects that we have today, with extra metadata. Commit 
>>>>>>>>>>>>>> processes are
>>>>>>>>>>>>>>    separate: committing to the table doesn’t alter the view and 
>>>>>>>>>>>>>> committing to
>>>>>>>>>>>>>>    the view doesn’t change the table. However, changing the view 
>>>>>>>>>>>>>> can make it
>>>>>>>>>>>>>>    so the table is no longer useful as a materialization.
>>>>>>>>>>>>>>    - *A combination of a view and a table*: in this option,
>>>>>>>>>>>>>>    the table metadata and view metadata are the same as the 
>>>>>>>>>>>>>> first option. The
>>>>>>>>>>>>>>    difference is that the commit process combines them, either 
>>>>>>>>>>>>>> by embedding a
>>>>>>>>>>>>>>    table metadata location in view metadata or by tracking both 
>>>>>>>>>>>>>> in the same
>>>>>>>>>>>>>>    catalog reference.
>>>>>>>>>>>>>>    - *A new metadata type*: this option is where we define a
>>>>>>>>>>>>>>    new metadata object that has view attributes, like SQL 
>>>>>>>>>>>>>> representations,
>>>>>>>>>>>>>>    along with table attributes, like partition specs and 
>>>>>>>>>>>>>> snapshots.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hopefully this is clear because I think much of the confusion
>>>>>>>>>>>>>> is caused by different definitions.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> The LoadTableResponse having optional metadata-location field
>>>>>>>>>>>>>> implies that the object in the catalog no longer needs to hold a 
>>>>>>>>>>>>>> metadata
>>>>>>>>>>>>>> file pointer
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> The REST protocol has not removed the requirement for a
>>>>>>>>>>>>>> metadata file, so I’m going to keep focused on the MV design 
>>>>>>>>>>>>>> options.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> When we say a MV can be a “new metadata type”, it does not
>>>>>>>>>>>>>> mean it needs to define a completely brand new structure of the 
>>>>>>>>>>>>>> metadata
>>>>>>>>>>>>>> content
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I’m making a distinction between separate metadata files for
>>>>>>>>>>>>>> the table and the view and a combined metadata object, as above.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> We can define an “Iceberg MV” to be an object in a catalog,
>>>>>>>>>>>>>> which has 1 table metadata file pointer, and 1 view metadata 
>>>>>>>>>>>>>> file pointer
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> This is the option I am referring to as a “combination of a
>>>>>>>>>>>>>> view and a table”.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> So to review my initial email, I don’t see a reason why a
>>>>>>>>>>>>>> combined view and table is advantageous, either implemented by 
>>>>>>>>>>>>>> having a
>>>>>>>>>>>>>> catalog reference with two metadata locations or embedding a 
>>>>>>>>>>>>>> table metadata
>>>>>>>>>>>>>> location in view metadata. This would cause unnecessary 
>>>>>>>>>>>>>> dependence between
>>>>>>>>>>>>>> the view and table in catalogs. I guess there’s an argument that 
>>>>>>>>>>>>>> you could
>>>>>>>>>>>>>> load both table and view metadata locations at the same time. 
>>>>>>>>>>>>>> That hardly
>>>>>>>>>>>>>> seems worth the trouble given the recent issues with adding 
>>>>>>>>>>>>>> views to the
>>>>>>>>>>>>>> JDBC catalog.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I also think that once we decide on structure, we can make it
>>>>>>>>>>>>>> possible for REST catalog implementations to do smart things, in 
>>>>>>>>>>>>>> a way that
>>>>>>>>>>>>>> doesn’t put additional requirements on the underlying catalog 
>>>>>>>>>>>>>> store. For
>>>>>>>>>>>>>> instance, we could specify how to send additional objects in a
>>>>>>>>>>>>>> LoadViewResult, in case the catalog wants to pre-fetch table 
>>>>>>>>>>>>>> metadata. I
>>>>>>>>>>>>>> think these optimizations are a later addition, after we define 
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>> relationship between views and tables.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Jack, it sounds like you’re the proponent of a combined table
>>>>>>>>>>>>>> and view (rather than a new metadata spec for a materialized 
>>>>>>>>>>>>>> view). What is
>>>>>>>>>>>>>> the main motivation? It seems like you’re convinced of that 
>>>>>>>>>>>>>> approach, but I
>>>>>>>>>>>>>> don’t understand the advantage it brings.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Thu, Feb 29, 2024 at 12:26 PM Szehon Ho <
>>>>>>>>>>>>>> szehon.apa...@gmail.com> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Hi
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Yes I mostly agree with the assessment.  To clarify a few
>>>>>>>>>>>>>>> minor points.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> is a materialized view a view and a separate table, a
>>>>>>>>>>>>>>>> combination of the two (i.e. commits are combined), or a new 
>>>>>>>>>>>>>>>> metadata type?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> For 'new metadata type', I consider mostly Jack's initial
>>>>>>>>>>>>>>> proposal of a new Catalog MV object that has two references 
>>>>>>>>>>>>>>> (ViewMetadata +
>>>>>>>>>>>>>>> TableMetadata).
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> The arguments that I see for a combined materialized view
>>>>>>>>>>>>>>>> object are:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>    - Regular views are separate, rather than being tables
>>>>>>>>>>>>>>>>    with SQL and no data so it would be inconsistent (“Iceberg 
>>>>>>>>>>>>>>>> view is just a
>>>>>>>>>>>>>>>>    table with no data but with representations defined. But we 
>>>>>>>>>>>>>>>> did not do
>>>>>>>>>>>>>>>>    that.”)
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>    - Materialized views are different objects in DDL
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>    - Tables may be a superset of functionality needed for
>>>>>>>>>>>>>>>>    materialized views
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>    - Tables are not typically exposed to end users — but
>>>>>>>>>>>>>>>>    this isn’t required by the separate view and table option
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> For completeness, there seem to be a few additional ones
>>>>>>>>>>>>>>> (mentioned in the Slack and above messages).
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>    - Lack of spec change (to ViewMetadata).  But as Jack
>>>>>>>>>>>>>>>    says it is a spec change (ie, to catalogs)
>>>>>>>>>>>>>>>    - A single call to get the View's StorageTable (versus
>>>>>>>>>>>>>>>    two calls)
>>>>>>>>>>>>>>>    - A more natural API, no opportunity for user to call
>>>>>>>>>>>>>>>    Catalog.dropTable() and renameTable() on storage table
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> *Thoughts:  *I think the long discussion sessions we had on
>>>>>>>>>>>>>>> Slack was fruitful for me, as seeing the API clarified some 
>>>>>>>>>>>>>>> things.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I was initially more in favor of MV being a new metadata
>>>>>>>>>>>>>>> type (TableMetadata + ViewMetadata).  But seeing most of the MV 
>>>>>>>>>>>>>>> operations
>>>>>>>>>>>>>>> end up being ViewCatalog or Catalog operations, I am starting 
>>>>>>>>>>>>>>> to think
>>>>>>>>>>>>>>> API-wise that it may not align with the new metadata type 
>>>>>>>>>>>>>>> (unless we define
>>>>>>>>>>>>>>> MVCatalog and /MV REST endpoints, which then are boilerplate 
>>>>>>>>>>>>>>> wrappers).
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Initially one question I had for option 'a view and a
>>>>>>>>>>>>>>> separate table', was how to make this table reference 
>>>>>>>>>>>>>>> (metadata.json or
>>>>>>>>>>>>>>> catalog reference).  In the previous option, we had a precedent 
>>>>>>>>>>>>>>> of Catalog
>>>>>>>>>>>>>>> references to Metadata, but not pointers between Metadatas.  I 
>>>>>>>>>>>>>>> initially
>>>>>>>>>>>>>>> saw the proposed Catalog's TableIdentifier pointer as 
>>>>>>>>>>>>>>> 'polluting' catalog
>>>>>>>>>>>>>>> concerns in ViewMetadata.  (I saw Catalog and ViewCatalog as a 
>>>>>>>>>>>>>>> layer above
>>>>>>>>>>>>>>> TableMetadata and ViewMetadata).  But I think Dan in the Slack 
>>>>>>>>>>>>>>> made a fair
>>>>>>>>>>>>>>> point that ViewMetadata already is tightly bound with a 
>>>>>>>>>>>>>>> Catalog.  In this
>>>>>>>>>>>>>>> case, I think this approach does have its merits as well in 
>>>>>>>>>>>>>>> aligning
>>>>>>>>>>>>>>> Catalog API's with the metadata.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>>>> Szehon
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Thu, Feb 29, 2024 at 5:45 AM Jan Kaul
>>>>>>>>>>>>>>> <jank...@mailbox.org.invalid> <jank...@mailbox.org.invalid>
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Hi all,
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I would like to provide my perspective on the question of
>>>>>>>>>>>>>>>> what a materialized view is and elaborate on Jack's recent 
>>>>>>>>>>>>>>>> proposal to view
>>>>>>>>>>>>>>>> a materialized view as a catalog concept.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Firstly, let's look at the role of the catalog. Every
>>>>>>>>>>>>>>>> entity in the catalog has a *unique identifier*, and the
>>>>>>>>>>>>>>>> catalog provides methods to create, load, and update these 
>>>>>>>>>>>>>>>> entities. An
>>>>>>>>>>>>>>>> important thing to note is that the catalog methods exhibit 
>>>>>>>>>>>>>>>> two different
>>>>>>>>>>>>>>>> behaviors: the *create and load methods deal with the
>>>>>>>>>>>>>>>> entire entity*, while the *update(commit) method only
>>>>>>>>>>>>>>>> deals with partial changes* to the entities.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> In the context of our current discussion, materialized view
>>>>>>>>>>>>>>>> (MV) metadata is a union of view and table metadata. The fact 
>>>>>>>>>>>>>>>> that the
>>>>>>>>>>>>>>>> update method deals only with partial changes, enables us to 
>>>>>>>>>>>>>>>> *reuse
>>>>>>>>>>>>>>>> the existing methods for updating tables and views*. For
>>>>>>>>>>>>>>>> updates we don't have to define what constitutes an entire 
>>>>>>>>>>>>>>>> materialized
>>>>>>>>>>>>>>>> view. Changes to a materialized view targeting the properties 
>>>>>>>>>>>>>>>> related to
>>>>>>>>>>>>>>>> the view metadata could use the update(commit) view method. 
>>>>>>>>>>>>>>>> Similarly,
>>>>>>>>>>>>>>>> changes targeting the properties related to the table metadata 
>>>>>>>>>>>>>>>> could use
>>>>>>>>>>>>>>>> the update(commit) table method. This is great news because we 
>>>>>>>>>>>>>>>> don't have
>>>>>>>>>>>>>>>> to redefine view and table commits (requirements, updates).
>>>>>>>>>>>>>>>> This is shown in the fact that Jack uses the same operation
>>>>>>>>>>>>>>>> to update the storage table for Option 1 and 3:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> // REST: POST
>>>>>>>>>>>>>>>> /namespaces/db1/tables/mv1?materializedView=true
>>>>>>>>>>>>>>>> // non-REST: update JSON files at table_metadata_location
>>>>>>>>>>>>>>>> storageTable.newAppend().appendFile(...).commit();
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> The open question is *whether the create and load methods
>>>>>>>>>>>>>>>> should treat the properties that constitute the MV metadata as 
>>>>>>>>>>>>>>>> two entities
>>>>>>>>>>>>>>>> (View + Table) or one entity (new MV object)*. This is all
>>>>>>>>>>>>>>>> part of Jack's proposal, where Option 1 proposes a new MV 
>>>>>>>>>>>>>>>> object, and
>>>>>>>>>>>>>>>> Option 3 proposes two separate entities. The advantage of 
>>>>>>>>>>>>>>>> Option 1 is that
>>>>>>>>>>>>>>>> it doesn't require two operations to load the metadata. On the 
>>>>>>>>>>>>>>>> other hand,
>>>>>>>>>>>>>>>> the advantage of Option 3 is that no new operations or 
>>>>>>>>>>>>>>>> catalogs have to be
>>>>>>>>>>>>>>>> defined.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> In my opinion, defining a new representation for
>>>>>>>>>>>>>>>> materialized views (Option 1) is generally the cleaner 
>>>>>>>>>>>>>>>> solution. However, I
>>>>>>>>>>>>>>>> see a path where we could first introduce Option 3 and still 
>>>>>>>>>>>>>>>> have the
>>>>>>>>>>>>>>>> possibility to transition to Option 1 if needed. The great 
>>>>>>>>>>>>>>>> thing about
>>>>>>>>>>>>>>>> Option 3 is that it only requires minor changes to the current 
>>>>>>>>>>>>>>>> spec and is
>>>>>>>>>>>>>>>> mostly implementation detail.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Therefore I would propose small additions to Jacks Option 3
>>>>>>>>>>>>>>>> that only introduce changes to the spec that are not specific 
>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>> materialized views. The idea is to introduce boolean 
>>>>>>>>>>>>>>>> properties to be set
>>>>>>>>>>>>>>>> on the creation of the view and the storage table that 
>>>>>>>>>>>>>>>> indicate that they
>>>>>>>>>>>>>>>> belong to a materialized view. The view property 
>>>>>>>>>>>>>>>> "materialized" is set to
>>>>>>>>>>>>>>>> "true" for a MV and "false" for a regular view. And the table 
>>>>>>>>>>>>>>>> property
>>>>>>>>>>>>>>>> "storage_table" is set to "true" for a storage table and 
>>>>>>>>>>>>>>>> "false" for a
>>>>>>>>>>>>>>>> regular table. The absence of these properties indicates a 
>>>>>>>>>>>>>>>> regular view or
>>>>>>>>>>>>>>>> table.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> ViewCatalog viewCatalog = (ViewCatalog) catalog;
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> // REST: GET /namespaces/db1/views/mv1
>>>>>>>>>>>>>>>> // non-REST: load JSON file at metadata_location
>>>>>>>>>>>>>>>> View mv = viewCatalog.loadView(TableIdentifier.of("db1",
>>>>>>>>>>>>>>>> "mv1"));
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> // REST: GET /namespaces/db1/tables/mv1
>>>>>>>>>>>>>>>> // non-REST: load JSON file at table_metadata_location if
>>>>>>>>>>>>>>>> present
>>>>>>>>>>>>>>>> Table storageTable = view.storageTable();
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> // REST: POST /namespaces/db1/tables/mv1
>>>>>>>>>>>>>>>> // non-REST: update JSON file at table_metadata_location
>>>>>>>>>>>>>>>> storageTable.newAppend().appendFile(...).commit();
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> We could then introduce a new requirement for views and
>>>>>>>>>>>>>>>> tables called "AssertProperty" which could make sure to only 
>>>>>>>>>>>>>>>> perform
>>>>>>>>>>>>>>>> updates that are inline with materialized views. The 
>>>>>>>>>>>>>>>> additional requirement
>>>>>>>>>>>>>>>> can be seen as a general extension which does not need to be 
>>>>>>>>>>>>>>>> changed if we
>>>>>>>>>>>>>>>> decide to got with Option 1 in the future.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Let me know what you think.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Best wishes,
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Jan
>>>>>>>>>>>>>>>> On 29.02.24 04:09, Walaa Eldin Moustafa wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thanks Ryan for the insights. I agree that reusing existing
>>>>>>>>>>>>>>>> metadata definitions and minimizing spec changes are very 
>>>>>>>>>>>>>>>> important. This
>>>>>>>>>>>>>>>> also minimizes spec drift (between materialized views and 
>>>>>>>>>>>>>>>> views spec, and
>>>>>>>>>>>>>>>> between materialized views and tables spec), and simplifies the
>>>>>>>>>>>>>>>> implementation.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> In an effort to take the discussion forward with concrete
>>>>>>>>>>>>>>>> design options based on an end-to-end implementation, I have 
>>>>>>>>>>>>>>>> prototyped the
>>>>>>>>>>>>>>>> implementation (and added Spark support) in this PR
>>>>>>>>>>>>>>>> https://github.com/apache/iceberg/pull/9830. I hope it
>>>>>>>>>>>>>>>> helps us reach convergence faster. More details about some of 
>>>>>>>>>>>>>>>> the design
>>>>>>>>>>>>>>>> options are discussed in the description of the PR.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>> Walaa.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On Wed, Feb 28, 2024 at 6:20 PM Ryan Blue <b...@tabular.io>
>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I mean separate table and view metadata that is somehow
>>>>>>>>>>>>>>>>> combined through a commit process. For instance, keeping a 
>>>>>>>>>>>>>>>>> pointer to a
>>>>>>>>>>>>>>>>> table metadata file in a view metadata file or combining 
>>>>>>>>>>>>>>>>> commits to
>>>>>>>>>>>>>>>>> reference both. I don't see the value in either option.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Wed, Feb 28, 2024 at 5:05 PM Jack Ye <
>>>>>>>>>>>>>>>>> yezhao...@gmail.com> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Thanks Ryan for the help to trace back to the root
>>>>>>>>>>>>>>>>>> question! Just a clarification question regarding your reply 
>>>>>>>>>>>>>>>>>> before I reply
>>>>>>>>>>>>>>>>>> further: what exactly does the option "a combination of the 
>>>>>>>>>>>>>>>>>> two (i.e.
>>>>>>>>>>>>>>>>>> commits are combined)" mean? How is that different from "a 
>>>>>>>>>>>>>>>>>> new metadata
>>>>>>>>>>>>>>>>>> type"?
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> -Jack
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>

Reply via email to