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