I would vote to keep a log in the doc with open questions, and keep the doc
updated with open questions as they arise/get resolved.

On Tue, Feb 20, 2024 at 11:37 AM Jack Ye <yezhao...@gmail.com> wrote:

> Thanks for the response from everyone!
>
> Before proceeding further, I see a few people referring back to the
> current design from Jan. I specifically raised this thread based on the
> information in the doc and a few latest discussions we had there. Because
> there are many threads in the doc, and each thread points further to other
> discussion threads in the same doc or other doc, it is now quite hard to
> follow and continue discussing all different topics there.
>
> I hope we can make incremental consensus of the questions in the doc
> through devlist, because it provides more visibility, and also a single
> thread instead of multiple threads going on at the same time. If we think
> this format is not effective, I propose that we create a new mv channel in
> Iceberg Slack workspace, and people interested can join and discuss all
> these points directly. What do we think?
>
> Best,
> Jack Ye
>
>
>
> On Mon, Feb 19, 2024 at 6:03 PM Szehon Ho <szehon.apa...@gmail.com> wrote:
>
>> Hi,
>>
>> Great to see more discussion on the MV spec.  Actually, Jan's document 
>> "Iceberg
>> Materialized View Spec"
>> <https://docs.google.com/document/d/1UnhldHhe3Grz8JBngwXPA6ZZord1xMedY5ukEhZYF-A>
>>  has
>> been organized , with a "Design Questions" section to track these debates,
>> and it would be nice to centralize the debates there, as Micah mentions.
>>
>> For Dan's question, I think this debate was tracked in "Design Question
>> 3: Should the storage table be registered in the catalog?". I think the
>> general idea there was to not expose it directly via Catalog as it is then
>> exposed to user modification. If the engine wants to access anything about
>> the storage table (including audit and storage), it is of course there via
>> the storage table pointer. I think Walaa's point is also good, we could
>> expose it as we expose metadata tables, but I am still not sure if there is
>> still some use-cases of engine access not covered?
>>
>> It is true that for Jack's initial question (Do we really want to go with
>> the MV = view + storage table design approach for Iceberg MV?),
>> unfortunately we did not capture it as a "Design Question" in Jan's doc, as
>> it was an implicit assumption of 'yes', because it is the choice of Hive,
>> Trino, and other engines , as others have pointed out.
>>
>> Jack's point about potential evolution of MV (like to add partitioning)
>> is an interesting one, but definitely hard to grasp.  I think it makes
>> sense to add this as a separate Design Question in the doc, and add the
>> options.  This will allow us to flesh out this alternative
>> option(s).  Maybe Micah's point about modifying existing proposal to
>> 'embed' the required table metadata fields in the existing view metadata,
>> is one middle ground option.  Or we add a totally new MV object spec for
>> MV, separate than existing View spec?
>>
>> Also , as Jack pointed out, it may make sense to have the REST / Catalog
>> API proposal in the doc to educate the above decision.
>>
>> Thanks
>> Szehon
>>
>> On Mon, Feb 19, 2024 at 4:08 PM Walaa Eldin Moustafa <
>> wa.moust...@gmail.com> wrote:
>>
>>> I think it would help if we answer the question of whether an MV is a
>>> view + storage table (and degree of exposing this underlying
>>> implementation) in the context of the user interfacing with those concepts:
>>>
>>> For the end user, interfacing with the engine APIs (e.g., through SQL),
>>> materialized view APIs should be almost the same as regular view APIs
>>> (except for operations specific to materialized views like REFRESH command
>>> etc). Typically, the end user interacts with the (materialized) view object
>>> as a view, and the engine performs the abstraction over the storage table.
>>>
>>> For the engines interfacing with Iceberg, it sounds the correct
>>> abstraction at this layer is indeed view + storage table, and engines could
>>> have access to both objects to optimize queries.
>>>
>>> So in a sense, the engine will ultimately hide most of the
>>> storage detail from the end user (except for advanced users who want to
>>> explicitly access the storage table with a modifier like
>>> "db.view.storageTable" -- and they can only read it), while Iceberg will
>>> expose the storage details to the engine catalog to use it in scans if
>>> needed. So the storage table is hidden or exposed based on the context/the
>>> actual users. From Iceberg point of view (which interacts with the
>>> engines), the storage table is exposed. Note that this does not
>>> necessarily mean that the storage table is registered in the catalog with
>>> its own independent name (e.g., where we can drop the view but keep the
>>> storage table and access it from the catalog). Addressing the storage table
>>> using a virtual namespace like "db.view.storageTable" sounds like a good
>>> middle ground. Anyways, end users should not need to directly access the
>>> storage table in most cases.
>>>
>>> Thanks,
>>> Walaa.
>>>
>>> On Mon, Feb 19, 2024 at 3:38 PM Micah Kornfield <emkornfi...@gmail.com>
>>> wrote:
>>>
>>>> Hi Jack,
>>>>
>>>>
>>>>> In my mind, the first key point we all need to agree upon to move this
>>>>> design forward is*: Do we really want to go with the MV = view +
>>>>> storage table design approach for Iceberg MV?*
>>>>
>>>>
>>>> I think we want this to the extent that we do not want to redefine the
>>>> same concept with different representations/naming to the greatest degree
>>>> possible.  This is why borrowing the concepts from the view (e.g. multiple
>>>> ways of expressing the same view logic in different dialects) and aspects
>>>> of the materialized data (e.g. partitioning, ordering) feels most natural.
>>>> IIUC your proposal, I think you are saying maybe two modifications to the
>>>> existing proposals in the document:
>>>>
>>>> 1.  No separate storage table link, instead embed most of the metadata
>>>> of the materialized table into the MV document (the exception seems to be
>>>> snapshot history)
>>>> 2.  For snapshot history, have one unified history specific to the MV.
>>>>
>>>> This seems fairly reasonable to me and I think I can solve some
>>>> challenges with the existing proposal in an elegant way.  If this is
>>>> correct (or maybe if it isn't quite correct) perhaps you can make
>>>> suggestions to the document so all of the trade-offs can be discussed in
>>>> one place?
>>>>
>>>> I think the one thing the current draft of the materialized view
>>>> ignores is how to store algebraic summaries (e.g. separate sum and count
>>>> for averages, or other sketches), so that new data can be incrementally
>>>> incorporated.  But representing these structures feels like it potentially
>>>> has value beyond just MVs (e.g. it can be a natural way to express summary
>>>> statistics in table metadata), so I think it deserves at least a try in
>>>> incorporating the concepts in the table specification, so the definitions
>>>> can be shared.  I was imagining this could come as part of the next
>>>> revision of MV specification.
>>>>
>>>> The MV internal structure could evolve in a way that works more
>>>>> efficiently with the reduced scope of functionalities, without relying on
>>>>> table to offer the same capabilities. I can at least say that is true 
>>>>> based
>>>>> on my internal knowledge of how Redshift MVs work.
>>>>
>>>>
>>>> I'm not sure I fully understand this point, but it seems the main
>>>> question here is what would break if it started to evolve in this
>>>> direction.  Is it purely additive or do we suspect some elements would need
>>>> to be removed?  My gut feeling here is the main concerns here are  getting
>>>> the cardinatities correct (i.e. 1 MV should probably have 0, 1 or more
>>>> materialized storage tables associated with it, to support more advanced
>>>> algebraic structures listed above, and perhaps a second without them, and
>>>> additional metadata to distinguish between these two different modes).
>>>>
>>>> If after the evaluation, we are confident that the MV = view + storage
>>>>> table approach is the right way to go, then we can debate the other 
>>>>> issues,
>>>>> and I think the next issue to reach consensus should be "Should the 
>>>>> storage
>>>>> table be registered in the catalog?".
>>>>
>>>>
>>>> I actually think there are actually more fundamental questions posed:
>>>> 1.  Should be considering how items should be modelled in the REST API
>>>> concurrently with the Iceberg spec, as that potentially impacts design
>>>> decision (I think the answer is yes, and we should update the doc with
>>>> sketches on new endpoints and operations on the endpoints to ensure things
>>>> align).
>>>> 2.  Going forward should new aspects of Iceberg artifacts rely on the
>>>> fact that a catalog is present and we can rely on a naming convention for
>>>> looking up other artifacts in a catalog as pointers (I lean yes on this,
>>>> but I'm a little bit more ambivalent).
>>>>
>>>> Thanks,
>>>> Micah
>>>>
>>>> On Mon, Feb 19, 2024 at 12:52 PM Jack Ye <yezhao...@gmail.com> wrote:
>>>>
>>>>> I suggest we need a step-by-step process to make incremental
>>>>> consensus, otherwise we are constantly talking about many different 
>>>>> debates
>>>>> at the same time.
>>>>>
>>>>> In my mind, the first key point we all need to agree upon to move this
>>>>> design forward is*: Do we really want to go with the MV = view +
>>>>> storage table design approach for Iceberg MV?*
>>>>>
>>>>> I think we (at least me) started with this assumption, mostly because
>>>>> this is how Trino implements MV, and how Hive tables store MV information
>>>>> today. But does it mean we should design it that way in Iceberg?
>>>>>
>>>>> Now I look back at how we did the view spec design, we could also say
>>>>> that we just add a representation field in the table spec to store view,
>>>>> and an Iceberg view is just a table with no data but with representations
>>>>> defined. But we did not do that. So it feels now quite inconsistent to say
>>>>> we want to just add a few fields in the table and view spec to call it an
>>>>> Iceberg MV.
>>>>>
>>>>> If we look into most of the other database systems (e.g. Redshift,
>>>>> BigQuery, Snowflake), they never expose such implementation details like
>>>>> storage table. Apart from being close-sourced systems, I think it is also
>>>>> for good technical reasons. There are many more things that a table needs
>>>>> to support, but does not really apply to MV. The MV internal structure
>>>>> could evolve in a way that works more efficiently with the reduced scope 
>>>>> of
>>>>> functionalities, without relying on table to offer the same capabilities. 
>>>>> I
>>>>> can at least say that is true based on my internal knowledge of how
>>>>> Redshift MVs work.
>>>>>
>>>>> I think we should fully evaluate both directions, and commit to one
>>>>> first before debating more things.
>>>>>
>>>>> If we have a new and independent Iceberg MV spec, then an Iceberg MV
>>>>> is under-the-hood a single object containing all MV information. It has 
>>>>> its
>>>>> own name, snapshots, view representation, etc. I don't believe we will be
>>>>> blocked by Trino due to its MV SPIs currently requiring the existence of a
>>>>> storage table, as it will just be a different implementation from the
>>>>> existing one in Trino-Iceberg. In this direction, I don't think we need to
>>>>> have any further debate about pointers, metadata locations, storage table,
>>>>> etc. because everything will be new.
>>>>>
>>>>> If after the evaluation, we are confident that the MV = view + storage
>>>>> table approach is the right way to go, then we can debate the other 
>>>>> issues,
>>>>> and I think the next issue to reach consensus should be "Should the 
>>>>> storage
>>>>> table be registered in the catalog?".
>>>>>
>>>>> What do we think?
>>>>>
>>>>> -Jack
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Mon, Feb 19, 2024 at 11:32 AM Daniel Weeks <dwe...@apache.org>
>>>>> wrote:
>>>>>
>>>>>> Jack,
>>>>>>
>>>>>> I think we should consider either allowing the storage table to be
>>>>>> fully exposed/addressable via the catalog or allow access via namespacing
>>>>>> like with metadata tables.  E.g. <catalog>.<database>.<table>.<storage>,
>>>>>> which would allow for full access to the underlying table.
>>>>>>
>>>>>> For other engines to interact with the storage table (e.g. to execute
>>>>>> the query to materialize the table), it may be necessary that the table 
>>>>>> is
>>>>>> fully addressable.  Whether the storage table is returned as part of list
>>>>>> operations may be something we leave up to the catalog implementation.
>>>>>>
>>>>>> I don't think the table should reference a physical location (only a
>>>>>> logical reference) since things will be changing behind the view 
>>>>>> definition
>>>>>> and I'm not confident we want to have to update the view representation
>>>>>> everytime the storage table is updated.
>>>>>>
>>>>>> I think there's still some exploration as to whether we need to model
>>>>>> this as separate from view endpoints, but there may be enough overlap 
>>>>>> that
>>>>>> it's not necessary to have yet another set of endpoints for materialized
>>>>>> views (maybe filter params if you need to distinguish?).
>>>>>>
>>>>>> -Dan
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Sun, Feb 18, 2024 at 6:57 PM Renjie Liu <liurenjie2...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi, Jack:
>>>>>>>
>>>>>>> Thanks for raising this.
>>>>>>>
>>>>>>> In most database systems, MV, view and table are considered
>>>>>>>> independent objects, at least at API level. It is very rare for a 
>>>>>>>> system to
>>>>>>>> support operations like "materializing a logical view" or "upgrading a
>>>>>>>> logical view to MV", because view and MV are very different in almost 
>>>>>>>> every
>>>>>>>> aspect of user experience. Extending the existing view or table spec to
>>>>>>>> accommodate MV might give us a MV implementation similar to the current
>>>>>>>> Trino or Hive views, save us some effort and a few APIs in REST, but it
>>>>>>>> binds us to a very specific design of MV, which we might regret in the
>>>>>>>> future.
>>>>>>>
>>>>>>>
>>>>>>> When I reviewed the doc, I thought we were discussing the spec of
>>>>>>> materialized view, just like the spec of table metadata, but didn't not 
>>>>>>> the
>>>>>>> user facing api. I would definitely agree that we should consider MV as
>>>>>>> another kind of database object in user facing api, even though it's
>>>>>>> internally modelled as a view + storage table pointer.
>>>>>>>
>>>>>>> If we want to make the REST experience good for MV, I think we
>>>>>>>> should at least consider directly describing the full metadata of the
>>>>>>>> storage table in Iceberg view, instead of pointing to a JSON file.
>>>>>>>
>>>>>>>
>>>>>>> Do you mean we need to add components like
>>>>>>> `LoadMaterializedViewResponse`, if so, I would +1 for this.
>>>>>>>
>>>>>>> *Q2: what REST APIs do we expect to use for interactions with MVs?*
>>>>>>>
>>>>>>>
>>>>>>> As I have mentioned above,  I think we should consider MV as another
>>>>>>> database object, so I think we should add a set of apis specifically
>>>>>>> designed for MV, such as `loadMV`, `freshMV`.
>>>>>>>
>>>>>>> On Sat, Feb 17, 2024 at 11:14 AM Jack Ye <yezhao...@gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Hi everyone,
>>>>>>>>
>>>>>>>> As we are discussing the spec change for materialized view, there
>>>>>>>> has been a missing aspect that is technically also related, and might
>>>>>>>> affect the MV spec design: *how do we want to add MV support to
>>>>>>>> the REST spec?*
>>>>>>>>
>>>>>>>> I would like to discuss this in a new thread to collect people's
>>>>>>>> thoughts. This topic expands to the following 2 sub-questions:
>>>>>>>>
>>>>>>>> *Q1: how would the MV spec change affect the REST spec?*
>>>>>>>> In the current proposal, it looks like we are using a design where
>>>>>>>> a MV is modeled as an Iceberg view linking to an Iceberg storage 
>>>>>>>> table. At
>>>>>>>> the same time, we do not want to expose this storage table in the 
>>>>>>>> catalog,
>>>>>>>> thus the Iceberg view has a pointer to only a metadata JSON file of the
>>>>>>>> Iceberg storage table. Each MV refresh updates the pointer to a new
>>>>>>>> metadata JSON file.
>>>>>>>>
>>>>>>>> I feel this does not play very well with the direction that REST is
>>>>>>>> going. The REST catalog is trying to remove the dependency to the 
>>>>>>>> metadata
>>>>>>>> JSON file. For example, in LoadTableResponse the only required field 
>>>>>>>> is the
>>>>>>>> metadata, and metadata-location is actually optional.
>>>>>>>>
>>>>>>>> If we want to make the REST experience good for MV, I think we
>>>>>>>> should at least consider directly describing the full metadata of the
>>>>>>>> storage table in Iceberg view, instead of pointing to a JSON file.
>>>>>>>>
>>>>>>>> *Q2: what REST APIs do we expect to use for interactions with MVs?*
>>>>>>>> So far we have been thinking about amending the view spec to
>>>>>>>> accommodate MV. This entails likely having MVs also being handled 
>>>>>>>> through
>>>>>>>> the view APIs in REST spec.
>>>>>>>>
>>>>>>>> We need to agree with that first in the community, because this has
>>>>>>>> various implications, and I am not really sure at this point if it is 
>>>>>>>> the
>>>>>>>> best way to go.
>>>>>>>>
>>>>>>>> If MV interactions are through the view APIs, the view APIs need to
>>>>>>>> be updated to accommodate MV constructs that are not really related to
>>>>>>>> logical views. In fact, most actions performed on MVs are more similar 
>>>>>>>> to
>>>>>>>> actions performed on table rather than view, which involve configuring 
>>>>>>>> data
>>>>>>>> layout, read and write constructs. For example, users might run 
>>>>>>>> something
>>>>>>>> like:
>>>>>>>>
>>>>>>>> CREATE MATERIALIZED VIEW mv
>>>>>>>> PARTITION BY col1
>>>>>>>> CLUSTER BY col2
>>>>>>>> AS ( // some sql )
>>>>>>>>
>>>>>>>> then the CreateView API needs to accept partition spec and sort
>>>>>>>> order that are completely not relevant for logical views.
>>>>>>>>
>>>>>>>> When reading a MV, we might even want to have a
>>>>>>>> PlanMaterializedView API similar to the PlanTable API we are adding.
>>>>>>>>
>>>>>>>> *My personal take*
>>>>>>>> It feels like we need to reconsider the question of what is the
>>>>>>>> best way to model MV in Iceberg. Should it be (1) a view linked to a
>>>>>>>> storage table, or (2) a table with a view SQL associated with it, or 
>>>>>>>> (3)
>>>>>>>> it's a completely independent thing. This topic was discussed in the 
>>>>>>>> past in
>>>>>>>> this doc
>>>>>>>> <https://docs.google.com/document/d/1QAuy-meSZ6Oy37iPym8sV_n7R2yKZOHunVR-ZWhhZ6Q/edit?pli=1>,
>>>>>>>> but at that time we did not have much perspective about aspects like 
>>>>>>>> REST
>>>>>>>> spec, and the view integration was also not fully completed yet. With 
>>>>>>>> the
>>>>>>>> new knowledge, currently I am actually leaning a bit more towards (3).
>>>>>>>>
>>>>>>>> In most database systems, MV, view and table are considered
>>>>>>>> independent objects, at least at API level. It is very rare for a 
>>>>>>>> system to
>>>>>>>> support operations like "materializing a logical view" or "upgrading a
>>>>>>>> logical view to MV", because view and MV are very different in almost 
>>>>>>>> every
>>>>>>>> aspect of user experience. Extending the existing view or table spec to
>>>>>>>> accommodate MV might give us a MV implementation similar to the current
>>>>>>>> Trino or Hive views, save us some effort and a few APIs in REST, but it
>>>>>>>> binds us to a very specific design of MV, which we might regret in the
>>>>>>>> future.
>>>>>>>>
>>>>>>>> If we make a new MV spec, it can be made up of fields that already
>>>>>>>> exist in the table and view specs, but it is a whole new spec. In this 
>>>>>>>> way,
>>>>>>>> the spec can evolve independently to accommodate MV specific features, 
>>>>>>>> and
>>>>>>>> we can also create MV-related REST endpoints that will evolve 
>>>>>>>> independently
>>>>>>>> from table and view REST APIs.
>>>>>>>>
>>>>>>>> But on the other side it is definitely associated with more work to
>>>>>>>> maintain a new spec, and potentially big refactoring in the codebase to
>>>>>>>> make sure operations today that work on table or view can now support 
>>>>>>>> MV as
>>>>>>>> a different object. And it definitely has other problems that I have
>>>>>>>> overlooked. I would greatly appreciate any thoughts about this!
>>>>>>>>
>>>>>>>> Best,
>>>>>>>> Jack Ye
>>>>>>>>
>>>>>>>>

Reply via email to