One additional point advantage of the separate view and table approach is
it will save the need to change all engine catalog APIs to expose
materialized views as separate objects with their own engine catalog APIs.
Hece, Iceberg can add the materialized view support without being blocked
on other engine-side changes.

Regarding the point of whether this approach dictates polluting the spec
with the table SQL (catalog) identifiers, I do not think it necessarily
does. We can always reference the storage or base tables by their storage
locations or UUIDs.

Are we converging to the separate table + view object representation?

Thanks,
Walaa.






On Thu, Feb 29, 2024 at 12:28 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>
> 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 independently without needing to also swap view metadata. This 
>>>>> also
>>>>> aligns with the idea from the original doc that there can be multiple
>>>>> materialization tables for a view. Each should operate independently 
>>>>> unless
>>>>> I’m missing something
>>>>>
>>>>> I don’t think the last paragraph’s conclusion is contentious so I’ll
>>>>> move on, but please stop here and reply if you disagree!
>>>>>
>>>>> That leaves the main two options, a view and a separate table linked
>>>>> by metadata, or, combined materialized view metadata.
>>>>>
>>>>> As the doc notes, the separate view and table option is simpler
>>>>> because it reuses existing metadata definitions and falls back to simple
>>>>> views. That is a significantly smaller spec and small is very, very
>>>>> important when it comes to specs. I think that the argument for a new
>>>>> definition of a materialized view needs to overcome this disadvantage.
>>>>>
>>>>> 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
>>>>>
>>>>> Am I missing any arguments for combined metadata?
>>>>>
>>>>> Ryan
>>>>> --
>>>>> Ryan Blue
>>>>> Tabular
>>>>>
>>>>
>>>
>>> --
>>> Ryan Blue
>>> Tabular
>>>
>>

Reply via email to