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 >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Wed, Feb 28, 2024 at 2:10 PM Ryan Blue <b...@tabular.io> >>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I’m catching up on this conversation, so hopefully I can >>>>>>>>>>>>>>>>> bring a fresh perspective. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Jack already pointed out that we need to start from the >>>>>>>>>>>>>>>>> basics and I agree with that. Let’s remove voting at this >>>>>>>>>>>>>>>>> point. Right now >>>>>>>>>>>>>>>>> is the time for discussing trade-offs, not lining up and >>>>>>>>>>>>>>>>> taking sides. I >>>>>>>>>>>>>>>>> realize that wasn’t the intent with adding a vote, but that’s >>>>>>>>>>>>>>>>> almost always >>>>>>>>>>>>>>>>> the result. It’s too easy to use it as a stand-in for >>>>>>>>>>>>>>>>> consensus and move on >>>>>>>>>>>>>>>>> prematurely. I get the impression from the swirl in Slack >>>>>>>>>>>>>>>>> that discussion >>>>>>>>>>>>>>>>> has moved ahead of agreement. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> We’re still at the most basic question: 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 now, I’m ignoring whether the “separate table” is some >>>>>>>>>>>>>>>>> kind of “system table” (meaning hidden?) or if it is exposed >>>>>>>>>>>>>>>>> in the >>>>>>>>>>>>>>>>> catalog. That’s a later choice (already pointed out) and, I >>>>>>>>>>>>>>>>> suspect, it >>>>>>>>>>>>>>>>> should be delegated to catalog implementations. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> To simplify this a little, I think that we can eliminate >>>>>>>>>>>>>>>>> the option to combine table and view commits. I don’t think >>>>>>>>>>>>>>>>> there is a >>>>>>>>>>>>>>>>> reason to combine the two. If separate, a table would track >>>>>>>>>>>>>>>>> the view >>>>>>>>>>>>>>>>> version used along with freshness information for referenced >>>>>>>>>>>>>>>>> tables. If the >>>>>>>>>>>>>>>>> table is automatically skipped when the version no longer >>>>>>>>>>>>>>>>> matches the view, >>>>>>>>>>>>>>>>> then no action needs to happen when a view definition >>>>>>>>>>>>>>>>> changes. Similarly, >>>>>>>>>>>>>>>>> the table can be updated independentl >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>