I'll point a link to this thread on dev@arrow so people not subscribed to
both can way in?  Should we maybe start a new thread about IR?

https://docs.google.com/document/d/1C_XVOG7iFkl6cgWWMyzUoIjfKt-X2UxqagPJrla0bAE/edit
is the document that Wes wrote up that started the conversation.

On Thu, Aug 26, 2021 at 1:42 PM Ryan Blue <b...@tabular.io> wrote:

> Micah or someone more familiar (Jacques?), could you summarize some of the
> details of the Arrow IR proposal? What are the intended use cases and
> goals? We'd want to see whether the goals align with our own.
>
> On Thu, Aug 26, 2021 at 9:24 AM Micah Kornfield <emkornfi...@gmail.com>
> wrote:
>
>> Small tangent:
>>
>> Regarding an IR, Apache Arrow is looking at this now [1] with several RFC
>> proposals.  It would be nice to coordinate, at least to make sure
>> translation from one IR to another isn't too onerous (in an ideal world we
>> could maybe share the same one).  Either way external feedback would be
>> useful.
>>
>> Cheers,
>> Micah
>>
>>
>> [1]
>> https://mail-archives.apache.org/mod_mbox/arrow-dev/202108.mbox/%3cCAKa9qDmLq_4dcmFTJJWpp=ejd0qpl9lygynq2jagxo+lfer...@mail.gmail.com%3e
>>
>> On Thu, Aug 26, 2021 at 8:21 AM Ryan Blue <b...@tabular.io> wrote:
>>
>>> I think that the current proposal is looking good, but it is always a
>>> good idea to give people a few days to review it and bring up any issues or
>>> further discussion on the topics in this thread.
>>>
>>> I'll also add this to the next sync agenda so we can farm for dissent
>>> next week. Sometimes you can get a better read on what is still concerning
>>> in person.
>>>
>>> Ryan
>>>
>>> On Wed, Aug 25, 2021 at 9:46 PM Anjali Norwood
>>> <anorw...@netflix.com.invalid> wrote:
>>>
>>>> Hello All,
>>>> I answered all the comments and made changes to the spec to reflect
>>>> them .. the doc now shows the new revision (link here:
>>>> https://docs.google.com/document/d/1wQt57EWylluNFdnxVxaCkCSvnWlI8vVtwfnPjQ6Y7aw/edit#
>>>> ).
>>>> Please diff with the version named 'Spec v1' in order to see the
>>>> deltas. Please let me know if any of your comments are not
>>>> satisfactorily addressed.
>>>>
>>>> @Ryan, Thank you for the insightful feedback, especially around the use
>>>> of Iceberg data types for schema and possible evolution.
>>>> I agree with your comment: *"I think we should move forward with the
>>>> proposal as it is, and pursue type annotations and possibly IR in
>>>> parallel."*
>>>> How do we achieve consensus/farm for dissent and move forward with the
>>>> proposal?
>>>>
>>>> thanks,
>>>> Anjali.
>>>>
>>>>
>>>>
>>>> On Sun, Aug 22, 2021 at 11:12 AM John Zhuge <jzh...@apache.org> wrote:
>>>>
>>>>> +1
>>>>>
>>>>> On Sun, Aug 22, 2021 at 10:02 AM Ryan Blue <b...@tabular.io> wrote:
>>>>>
>>>>>> Thanks for working on this, Anjali! It’s great to see the thorough
>>>>>> discussion here with everyone.
>>>>>>
>>>>>> For the discussion about SQL dialect, I think that the right first
>>>>>> step is to capture the SQL or query dialect. That will give us the most
>>>>>> flexibility. Engines that can use Coral for translation can attempt to
>>>>>> convert and engines that don’t can see if the SQL is valid and can be 
>>>>>> used.
>>>>>>
>>>>>> I think that the idea to create a minimal IR is an interesting one,
>>>>>> but can be added later. We will always need to record the SQL and 
>>>>>> dialect,
>>>>>> even if we translate to IR because users are going to configure views 
>>>>>> using
>>>>>> SQL. Uses like showing view history or debugging need to show the 
>>>>>> original
>>>>>> SQL, plus relevant information like where it was created and the SQL
>>>>>> dialect. We should be able to add this later by adding additional 
>>>>>> metadata
>>>>>> to the view definition. I don’t think that it would introduce breaking
>>>>>> changes to add a common representation that can be optionally consumed.
>>>>>>
>>>>>> Let’s continue talking about a minimal IR, separately. View
>>>>>> translation is a hard problem. Right now, to get views across engines we
>>>>>> have to compromise confidence. IR is a way to have strong confidence, but
>>>>>> with limited expressibility. I think that’s a good trade in a lot of 
>>>>>> cases
>>>>>> and is worth pursuing, even if it will take a long time.
>>>>>>
>>>>>> Jacques makes a great point about types, but I think that the right
>>>>>> option here is to continue using Iceberg types. We’ve already had
>>>>>> discussions about whether Iceberg should support annotating types with
>>>>>> engine-specific ones, so we have a reasonable way to improve this while
>>>>>> also providing compatibility across engines: char(n) is not
>>>>>> necessarily supported everywhere and mapping it to string will make
>>>>>> sense in most places. The schema is primarily used to validate that the
>>>>>> data produced by the query hasn’t changed and that is more about the 
>>>>>> number
>>>>>> of columns in structs and the names of fields rather than exact types. We
>>>>>> can fix up types when substituting without losing too much: if the SQL
>>>>>> produces a varchar(10) field that the view metadata says is a string,
>>>>>> then it’s okay that it is varchar(10). There is some loss in that we
>>>>>> don’t know if it was originally varchar(5), but I think that this is
>>>>>> not going to cause too many issues. Not all engines will even validate 
>>>>>> that
>>>>>> the schema has not changed, since it could be valid to use select *
>>>>>> from x where ... and allow new fields to appear.
>>>>>>
>>>>>> Right now, I think we should move forward with the proposal as it is,
>>>>>> and pursue type annotations and possibly IR in parallel. Does that sound
>>>>>> reasonable to everyone?
>>>>>>
>>>>>> Ryan
>>>>>>
>>>>>> On Thu, Jul 29, 2021 at 7:50 AM Piotr Findeisen <
>>>>>> pi...@starburstdata.com> wrote:
>>>>>>
>>>>>>> Hi Anjali,
>>>>>>>
>>>>>>> That's a nice summary.
>>>>>>>
>>>>>>> re dialect field. It shouldn't be a bit trouble to have it (or any
>>>>>>> other way to identify application that created the view), and it might 
>>>>>>> be
>>>>>>> useful.
>>>>>>> Why not make it required from the start?
>>>>>>>
>>>>>>> re "expanded/resolved SQL" -- i don't understand yet what we would
>>>>>>> put there, so cannot comment.
>>>>>>>
>>>>>>> I agree there it's nice to get something out of the door, and I see
>>>>>>> how the current proposal fits some needs already.
>>>>>>> However, i am concerned about the proliferation of non-cross-engine
>>>>>>> compatible views, if we do that.
>>>>>>>
>>>>>>> Also, if we later agree on any compatible approach (portable subset
>>>>>>> of SQL, engine-agnostic IR, etc.), then from the perspective of each
>>>>>>> engine, it would be a breaking change.
>>>>>>> Unless we make the compatible approach as expressive as full power
>>>>>>> of SQL, some views that are possible to create in v1 will not be 
>>>>>>> possible
>>>>>>> to create in v2.
>>>>>>> Thus, if v1  is "some SQL" and v2 is "something awesomely
>>>>>>> compatible", we may not be able to roll it out.
>>>>>>>
>>>>>>> > the convention of common SQL has been working for a majority of
>>>>>>> users. SQL features commonly used are column projections, simple filter
>>>>>>> application, joins, grouping and common aggregate and scalar function. A
>>>>>>> few users occasionally would like to use Trino or Spark specific 
>>>>>>> functions
>>>>>>> but are sometimes able to find a way to use a function that is common to
>>>>>>> both the engines.
>>>>>>>
>>>>>>>
>>>>>>> it's an awesome summary of what constructs are necessary to be able
>>>>>>> to define useful views, while also keep them portable.
>>>>>>>
>>>>>>> To be able to express column projections, simple filter application,
>>>>>>> joins, grouping and common aggregate and scalar function in a structured
>>>>>>> IR, how much effort do you think would be required?
>>>>>>> We didn't really talk about downsides of a structured approach,
>>>>>>> other than it looks complex.
>>>>>>> if we indeed estimate it as a multi-year effort, i wouldn't argue
>>>>>>> for that. Maybe i were overly optimistic though.
>>>>>>>
>>>>>>>
>>>>>>> As Jack mentioned, for engine-specific approach that's not supposed
>>>>>>> to be consumed by multiple engines, we may be better served with 
>>>>>>> approach
>>>>>>> that's outside of Iceberg spec, like
>>>>>>> https://github.com/trinodb/trino/pull/8540.
>>>>>>>
>>>>>>>
>>>>>>> Best,
>>>>>>> PF
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Thu, Jul 29, 2021 at 12:33 PM Anjali Norwood
>>>>>>> <anorw...@netflix.com.invalid> wrote:
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> Thank you for all the comments. I will try to address them all here
>>>>>>>> together.
>>>>>>>>
>>>>>>>>
>>>>>>>>    - @all Cross engine compatibility of view definition: Multiple
>>>>>>>>    options such as engine agnostic SQL or IR of some form have been 
>>>>>>>> mentioned.
>>>>>>>>    We can all agree that all of these options are non-trivial to
>>>>>>>>    design/implement (perhaps a multi-year effort based on the option 
>>>>>>>> chosen)
>>>>>>>>    and merit further discussion. I would like to suggest that we 
>>>>>>>> continue this
>>>>>>>>    discussion but target this work for the future (v2?). In v1, we can 
>>>>>>>> add an
>>>>>>>>    optional dialect field and an optional expanded/resolved SQL field 
>>>>>>>> that can
>>>>>>>>    be interpreted by engines as they see fit. V1 can unlock many use 
>>>>>>>> cases
>>>>>>>>    where the views are either accessed by a single engine or 
>>>>>>>> multi-engine use
>>>>>>>>    cases where a (common) subset of SQL is supported. This proposal 
>>>>>>>> allows for
>>>>>>>>    desirable features such as versioning of views and a common format 
>>>>>>>> of
>>>>>>>>    storing view metadata while allowing extensibility in the future. 
>>>>>>>> *Does
>>>>>>>>    anyone feel strongly otherwise?*
>>>>>>>>    - @Piotr  As for common views at Netflix, the restrictions on
>>>>>>>>    SQL are not enforced, but are advised as best practices. The 
>>>>>>>> convention of
>>>>>>>>    common SQL has been working for a majority of users. SQL features 
>>>>>>>> commonly
>>>>>>>>    used are column projections, simple filter application, joins, 
>>>>>>>> grouping and
>>>>>>>>    common aggregate and scalar function. A few users occasionally 
>>>>>>>> would like
>>>>>>>>    to use Trino or Spark specific functions but are sometimes able to 
>>>>>>>> find a
>>>>>>>>    way to use a function that is common to both the engines.
>>>>>>>>    - @Jacques and @Jack Iceberg data types are engine agnostic and
>>>>>>>>    hence were picked for storing view schema. Thinking further, the 
>>>>>>>> schema
>>>>>>>>    field should be made 'optional', since not all engines require it. 
>>>>>>>> (e.g.
>>>>>>>>    Spark does not need it and Trino uses it only for validation).
>>>>>>>>    - @Jacques Table references in the views can be arbitrary
>>>>>>>>    objects such as tables from other catalogs or elasticsearch tables 
>>>>>>>> etc. I
>>>>>>>>    will clarify it in the spec.
>>>>>>>>
>>>>>>>> I will work on incorporating all the comments in the spec and make
>>>>>>>> the next revision available for review soon.
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Anjali.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Tue, Jul 27, 2021 at 2:51 AM Piotr Findeisen <
>>>>>>>> pi...@starburstdata.com> wrote:
>>>>>>>>
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> Thanks Jack and Jacques for sharing your thoughts.
>>>>>>>>>
>>>>>>>>> I agree that tracking  dialect/origin is better than nothing.
>>>>>>>>> I think having a Map {dialect: sql} is not going to buy us much.
>>>>>>>>> I.e. it would be useful if there was some external app (or a human
>>>>>>>>> being) that would write those alternative SQLs for each dialect.
>>>>>>>>> Otherwise I am not imagining Spark writing SQL for Spark and
>>>>>>>>> Trino, or Trino writing SQL for Trino and Spark.
>>>>>>>>>
>>>>>>>>> Thanks Jacques for a good summary of SQL supporting options.
>>>>>>>>> While i like the idea of starting with Trino SQL ANTLR grammar
>>>>>>>>> file (it's really well written and resembles spec quite well), you 
>>>>>>>>> made a
>>>>>>>>> good point that grammar is only part of the problem. Coercions, 
>>>>>>>>> function
>>>>>>>>> resolution, dereference resolution, table resolution are part of query
>>>>>>>>> analysis that goes beyond just grammar.
>>>>>>>>> In fact, column scoping rules -- while clearly defined by the spec
>>>>>>>>> -- may easily differ between engines (pretty usual).
>>>>>>>>> That's why i would rather lean towards some intermediate
>>>>>>>>> representation that is *not *SQL, doesn't require parsing (is
>>>>>>>>> already structural), nor analysis (no scopes! no implicit coercions!).
>>>>>>>>> Before we embark on such a journey, it would be interesting to
>>>>>>>>> hear @Martin Traverso <mar...@starburstdata.com> 's thoughts on
>>>>>>>>> feasibility though.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Best,
>>>>>>>>> PF
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Fri, Jul 23, 2021 at 3:27 AM Jacques Nadeau <
>>>>>>>>> jacquesnad...@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>> Some thoughts...
>>>>>>>>>>
>>>>>>>>>>    - In general, many engines want (or may require) a resolved
>>>>>>>>>>    sql field. This--at minimum--typically includes star expansion 
>>>>>>>>>> since
>>>>>>>>>>    traditional view behavior is stars are expanded at view creation 
>>>>>>>>>> time
>>>>>>>>>>    (since this is the only way to guarantee that the view returns 
>>>>>>>>>> the same
>>>>>>>>>>    logical definition even if the underlying table changes). This 
>>>>>>>>>> may also
>>>>>>>>>>    include a replacement of relative object names to absolute object 
>>>>>>>>>> names
>>>>>>>>>>    based on the session catalog & namespace. If I recall correctly, 
>>>>>>>>>> Hive does
>>>>>>>>>>    both of these things.
>>>>>>>>>>    - It isn't clear in the spec whether the table references
>>>>>>>>>>    used in views are restricted to other Iceberg objects or can be 
>>>>>>>>>> arbitrary
>>>>>>>>>>    objects in the context of a particular engine. Maybe I missed 
>>>>>>>>>> this? For
>>>>>>>>>>    example, can I have a Trino engine view that references an 
>>>>>>>>>> Elasticsearch
>>>>>>>>>>    table stored in an Iceberg view?
>>>>>>>>>>    - Restricting schemas to the Iceberg types will likely lead
>>>>>>>>>>    to unintended consequences. I appreciate the attraction to it but 
>>>>>>>>>> I think
>>>>>>>>>>    it would either create artificial barriers around the types of 
>>>>>>>>>> SQL that are
>>>>>>>>>>    allowed and/or mean that replacing a CTE with a view could 
>>>>>>>>>> potentially
>>>>>>>>>>    change the behavior of the query which I believe violates most 
>>>>>>>>>> typical
>>>>>>>>>>    engine behaviors. A good example of this is the simple sql 
>>>>>>>>>> statement of
>>>>>>>>>>    "SELECT c1, 'foo' as c2 from table1". In many engines (and 
>>>>>>>>>> Calcite by
>>>>>>>>>>    default I believe), c2 will be specified as a CHAR(3). In this 
>>>>>>>>>> Iceberg
>>>>>>>>>>    context, is this view disallowed? If it isn't disallowed then you 
>>>>>>>>>> have an
>>>>>>>>>>    issue where the view schema will be required to be different from 
>>>>>>>>>> a CTE
>>>>>>>>>>    since the engine will resolve it differently than Iceberg. Even 
>>>>>>>>>> if you
>>>>>>>>>>    ignore CHAR(X), you've still got VARCHAR(X) to contend with...
>>>>>>>>>>    - It is important to remember that Calcite is a set of
>>>>>>>>>>    libraries and not a specification. There are things that can be 
>>>>>>>>>> specified
>>>>>>>>>>    in Calcite but in general it doesn't have formal specification as 
>>>>>>>>>> a first
>>>>>>>>>>    principle. It is more implementation as a first principle. This 
>>>>>>>>>> is in
>>>>>>>>>>    contrast to projects like Arrow and Iceberg, which start with 
>>>>>>>>>> well-formed
>>>>>>>>>>    specifications. I've been working with Calcite since before it 
>>>>>>>>>> was an
>>>>>>>>>>    Apache project and I wouldn't recommend adopting it as any form 
>>>>>>>>>> of a
>>>>>>>>>>    specification. On the flipside, I am very supportive of using it 
>>>>>>>>>> for a
>>>>>>>>>>    reference implementation standard for Iceberg view consumption,
>>>>>>>>>>    manipulation, etc.  If anything, I'd suggest we start with the 
>>>>>>>>>> adoption of
>>>>>>>>>>    a relatively clear grammar, e.g. the Antlr grammar file that 
>>>>>>>>>> Spark [1]
>>>>>>>>>>    and/or Trino [2] use. Even that is not a complete specification 
>>>>>>>>>> as grammar
>>>>>>>>>>    must still be interpreted with regards to type promotion, function
>>>>>>>>>>    resolution, consistent unnamed expression naming, etc that aren't 
>>>>>>>>>> defined
>>>>>>>>>>    at the grammar level. I'd definitely avoid using Calcite's JavaCC 
>>>>>>>>>> grammar
>>>>>>>>>>    as it heavily embeds implementation details (in a good way) and 
>>>>>>>>>> relies on
>>>>>>>>>>    some fairly complex logic in the validator and sql2rel components 
>>>>>>>>>> to be
>>>>>>>>>>    fully resolved/comprehended.
>>>>>>>>>>
>>>>>>>>>> Given the above, I suggest having a field which describes the
>>>>>>>>>> dialect(origin?) of the view and then each engine can decide how 
>>>>>>>>>> they want
>>>>>>>>>> to consume/mutate that view (and whether they want to or not). It 
>>>>>>>>>> does risk
>>>>>>>>>> being a dumping ground. Nonetheless, I'd expect the alternative of
>>>>>>>>>> establishing a formal SQL specification to be a similarly long 
>>>>>>>>>> process to
>>>>>>>>>> the couple of years it took to build the Arrow and Iceberg 
>>>>>>>>>> specifications.
>>>>>>>>>> (Realistically, there is far more to specify here than there is in 
>>>>>>>>>> either
>>>>>>>>>> of those two domains.)
>>>>>>>>>>
>>>>>>>>>> Some other notes:
>>>>>>>>>>
>>>>>>>>>>    - Calcite does provide a nice reference document [3] but it
>>>>>>>>>>    is not sufficient to implement what is necessary for
>>>>>>>>>>    parsing/validating/resolving a SQL string correctly/consistently.
>>>>>>>>>>    - Projects like Coral [4] are interesting here but even Coral
>>>>>>>>>>    is based roughly on "HiveQL" which also doesn't have a formal 
>>>>>>>>>> specification
>>>>>>>>>>    process outside of the Hive version you're running. See this 
>>>>>>>>>> thread in
>>>>>>>>>>    Coral slack [5]
>>>>>>>>>>    - ZetaSQL [6] also seems interesting in this space. It feels
>>>>>>>>>>    closer to specification based [7] than Calcite but is much less 
>>>>>>>>>> popular in
>>>>>>>>>>    the big data domain. I also haven't reviewed it's SQL 
>>>>>>>>>> completeness closely,
>>>>>>>>>>    a strength of Calcite.
>>>>>>>>>>    - One of the other problems with building against an
>>>>>>>>>>    implementation as opposed to a specification (e.g. Calcite) is it 
>>>>>>>>>> can make
>>>>>>>>>>    it difficult or near impossible to implement the same algorithms 
>>>>>>>>>> again
>>>>>>>>>>    without a bunch of reverse engineering. If interested in an 
>>>>>>>>>> example of
>>>>>>>>>>    this, see the discussion behind LZ4 deprecation on the Parquet 
>>>>>>>>>> spec [8] for
>>>>>>>>>>    how painful this kind of mistake can become.
>>>>>>>>>>    - I'd love to use the SQL specification itself but nobody
>>>>>>>>>>    actually implements that in its entirety and it has far too many 
>>>>>>>>>> places
>>>>>>>>>>    where things are "implementation-defined" [9].
>>>>>>>>>>
>>>>>>>>>> [1]
>>>>>>>>>> https://github.com/apache/spark/blob/master/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4
>>>>>>>>>> [2]
>>>>>>>>>> https://github.com/trinodb/trino/blob/master/core/trino-parser/src/main/antlr4/io/trino/sql/parser/SqlBase.g4
>>>>>>>>>> [3] https://calcite.apache.org/docs/reference.html
>>>>>>>>>> [4] https://github.com/linkedin/coral
>>>>>>>>>> [5]
>>>>>>>>>> https://coral-sql.slack.com/archives/C01FHBJR20Y/p1608064004073000
>>>>>>>>>> [6] https://github.com/google/zetasql
>>>>>>>>>> [7]
>>>>>>>>>> https://github.com/google/zetasql/blob/master/docs/one-pager.md
>>>>>>>>>> [8]
>>>>>>>>>> https://github.com/apache/parquet-format/blob/master/Compression.md#lz4
>>>>>>>>>> [9] https://twitter.com/sc13ts/status/1413728808830525440
>>>>>>>>>>
>>>>>>>>>> On Thu, Jul 22, 2021 at 12:01 PM Jack Ye <yezhao...@gmail.com>
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> Did not notice that we are also discussing cross-engine
>>>>>>>>>>> interoperability here, I will add my response in the design doc 
>>>>>>>>>>> here.
>>>>>>>>>>>
>>>>>>>>>>> I would personally prefer cross-engine interoperability as a
>>>>>>>>>>> goal and get the spec in the right structure in the initial release,
>>>>>>>>>>> because:
>>>>>>>>>>>
>>>>>>>>>>> 1. I believe that cross-engine compatibility is a critical
>>>>>>>>>>> feature of Iceberg. If I am a user of an existing data lake that 
>>>>>>>>>>> already
>>>>>>>>>>> supports views (e.g. Hive), I don't even need Iceberg to have this 
>>>>>>>>>>> view
>>>>>>>>>>> feature. I can do what is now done for Trino to use views with 
>>>>>>>>>>> Iceberg. I
>>>>>>>>>>> can also just use a table property to indicate the table is a view 
>>>>>>>>>>> and
>>>>>>>>>>> store the view SQL as a table property and do my own thing in any 
>>>>>>>>>>> query
>>>>>>>>>>> engine to support all the view features. One of the most valuable 
>>>>>>>>>>> and
>>>>>>>>>>> unique features that Iceberg view can unlock is to allow a view to 
>>>>>>>>>>> be
>>>>>>>>>>> created in one engine and read by another. Not supporting 
>>>>>>>>>>> cross-engine
>>>>>>>>>>> compatibility feels like losing a lot of value to me.
>>>>>>>>>>>
>>>>>>>>>>> 2. In the view definition, it feels inconsistent to me that we
>>>>>>>>>>> have "schema" as an Iceberg native schema, but "sql" field as the 
>>>>>>>>>>> view SQL
>>>>>>>>>>> that can come from any query engine. If the engine already needs to 
>>>>>>>>>>> convert
>>>>>>>>>>> the view schema to iceberg shema, it should just do the same for 
>>>>>>>>>>> the view
>>>>>>>>>>> SQL.
>>>>>>>>>>>
>>>>>>>>>>> Regarding the way to achieve it, I think it comes to either
>>>>>>>>>>> Apache Calcite (or some other third party alternative I don't know) 
>>>>>>>>>>> or our
>>>>>>>>>>> own implementation of some intermediate representation. I don't 
>>>>>>>>>>> have a very
>>>>>>>>>>> strong opinion, but my thoughts are the following:
>>>>>>>>>>>
>>>>>>>>>>> 1. Calcite is supposed to be the go-to software to deal with
>>>>>>>>>>> this kind of issue, but my personal concern is that the integration 
>>>>>>>>>>> is
>>>>>>>>>>> definitely going to be much more involved, and it will become 
>>>>>>>>>>> another
>>>>>>>>>>> barrier for newer engines to onboard because it not only needs to 
>>>>>>>>>>> implement
>>>>>>>>>>> Iceberg APIs but also needs Calcite support. It will also start to 
>>>>>>>>>>> become a
>>>>>>>>>>> constant discussion around what we maintain and what we should push 
>>>>>>>>>>> to
>>>>>>>>>>> Calcite, similar to our situation today with Spark.
>>>>>>>>>>>
>>>>>>>>>>> 2. Another way I am leaning towards, as Piotr also suggested, is
>>>>>>>>>>> to have a native lightweight logical query structure representation 
>>>>>>>>>>> of the
>>>>>>>>>>> view SQL and store that instead of the SQL string. We already deal 
>>>>>>>>>>> with
>>>>>>>>>>> Expressions in Iceberg, and engines have to convert predicates to 
>>>>>>>>>>> Iceberg
>>>>>>>>>>> expressions for predicate pushdown. So I think it would not be hard 
>>>>>>>>>>> to
>>>>>>>>>>> extend on that to support this use case. Different engines can 
>>>>>>>>>>> build this
>>>>>>>>>>> logical structure when traversing their own AST during a create 
>>>>>>>>>>> view query.
>>>>>>>>>>>
>>>>>>>>>>> 3. With these considerations, I think the "sql" field can
>>>>>>>>>>> potentially be a map (maybe called "engine-sqls"?), where key is 
>>>>>>>>>>> the engine
>>>>>>>>>>> type and version like "Spark 3.1", and value is the view SQL 
>>>>>>>>>>> string. In
>>>>>>>>>>> this way, the engine that creates the view can still read the SQL 
>>>>>>>>>>> directly
>>>>>>>>>>> which might lead to better engine-native integration and avoid 
>>>>>>>>>>> redundant
>>>>>>>>>>> parsing. But in this approach there is always a default intermediate
>>>>>>>>>>> representation it can fallback to when the engine's key is not 
>>>>>>>>>>> found in the
>>>>>>>>>>> map. If we want to make incremental progress and delay the design 
>>>>>>>>>>> for the
>>>>>>>>>>> intermediate representation, I think we should at least use this map
>>>>>>>>>>> instead of just a single string.
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Jack Ye
>>>>>>>>>>>
>>>>>>>>>>> On Thu, Jul 22, 2021 at 6:35 AM Piotr Findeisen <
>>>>>>>>>>> pi...@starburstdata.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Hi,
>>>>>>>>>>>>
>>>>>>>>>>>> First of all thank you for this discussion and all the
>>>>>>>>>>>> view-related work!
>>>>>>>>>>>>
>>>>>>>>>>>> I agree that solving cross-engine compatibility problem may not
>>>>>>>>>>>> be primary feature today, I am concerned that not thinking about 
>>>>>>>>>>>> this from
>>>>>>>>>>>> the start may "tunnel" us into a wrong direction.
>>>>>>>>>>>> Cross-engine compatible views would be such a cool feature that
>>>>>>>>>>>> it is hard to just let it pass.
>>>>>>>>>>>>
>>>>>>>>>>>> My thinking about a smaller IR may be a side-product of me not
>>>>>>>>>>>> being familiar enough with Calcite.
>>>>>>>>>>>> However, with new IR being focused on compatible
>>>>>>>>>>>> representation, and not being tied to anything are actually good 
>>>>>>>>>>>> things.
>>>>>>>>>>>> For example, we need to focus on JSON representation, but we
>>>>>>>>>>>> don't need to deal with tree traversal or anything, so the code 
>>>>>>>>>>>> for this
>>>>>>>>>>>> could be pretty simple.
>>>>>>>>>>>>
>>>>>>>>>>>> >  Allow only ANSI-compliant SQL and anything that is truly
>>>>>>>>>>>> common across engines in the view definition (this is how 
>>>>>>>>>>>> currently Netflix
>>>>>>>>>>>> uses these 'common' views across Spark and Trino)
>>>>>>>>>>>>
>>>>>>>>>>>> it's interesting. Anjali, do  you have means to enforce that,
>>>>>>>>>>>> or is this just a convention?
>>>>>>>>>>>>
>>>>>>>>>>>> What are the common building blocks (relational operations,
>>>>>>>>>>>> constructs and functions) that you found sufficient for expressing 
>>>>>>>>>>>> your
>>>>>>>>>>>> views?
>>>>>>>>>>>> Being able to enumerate them could help validate various
>>>>>>>>>>>> approaches considered here, including feasibility of dedicated
>>>>>>>>>>>> representation.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Best,
>>>>>>>>>>>> PF
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Thu, Jul 22, 2021 at 2:28 PM Ryan Murray <rym...@gmail.com>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Hey Anjali,
>>>>>>>>>>>>>
>>>>>>>>>>>>> I am definitely happy to help with implementing 1-3 in your
>>>>>>>>>>>>> first list once the spec has been approved by the community. My 
>>>>>>>>>>>>> hope is
>>>>>>>>>>>>> that the final version of the view spec will make it easy to
>>>>>>>>>>>>> re-use existing rollback/time travel/metadata etc functionalities.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Regarding SQL dialects.My personal opinion is: Enforcing
>>>>>>>>>>>>> ANSI-compliant SQL across all engines is hard and probably not
>>>>>>>>>>>>> desirable while storing Calcite makes it hard for eg python to 
>>>>>>>>>>>>> use views. A
>>>>>>>>>>>>> project to make a cross language and cross engine IR for sql 
>>>>>>>>>>>>> views and the
>>>>>>>>>>>>> relevant transpilers is imho outside the scope of this spec and 
>>>>>>>>>>>>> probably
>>>>>>>>>>>>> deserving an apache project of its own. A smaller IR like Piotr 
>>>>>>>>>>>>> suggested
>>>>>>>>>>>>> is possible but I feel it will likely quickly snowball into a 
>>>>>>>>>>>>> larger
>>>>>>>>>>>>> project and slow down adoption of the view spec in iceberg. So I 
>>>>>>>>>>>>> think the
>>>>>>>>>>>>> most reasonable way forward is to add a dialect field and a 
>>>>>>>>>>>>> warning to
>>>>>>>>>>>>> engines that views are not (yet) cross compatible. This is at 
>>>>>>>>>>>>> odds with the
>>>>>>>>>>>>> original spirit of iceberg tables and I wonder how the border 
>>>>>>>>>>>>> community
>>>>>>>>>>>>> feels about it? I would hope that we can make the view spec 
>>>>>>>>>>>>> engine-free
>>>>>>>>>>>>> over time and eventually deprecate the dialect field.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Best,
>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>
>>>>>>>>>>>>> PS if anyone is interested in collaborating on engine agnostic
>>>>>>>>>>>>> views please reach out. I am keen on exploring this topic.
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Tue, Jul 20, 2021 at 10:51 PM Anjali Norwood
>>>>>>>>>>>>> <anorw...@netflix.com.invalid> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thank you Ryan (M), Piotr and Vivekanand for the comments. I
>>>>>>>>>>>>>> have and will continue to address them in the doc.
>>>>>>>>>>>>>> Great to know about Trino views, Piotr!
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks to everybody who has offered help with implementation.
>>>>>>>>>>>>>> The spec as it is proposed in the doc has been implemented and 
>>>>>>>>>>>>>> is in use at
>>>>>>>>>>>>>> Netflix (currently on Iceberg 0.9). Once we close the spec, we 
>>>>>>>>>>>>>> will rebase
>>>>>>>>>>>>>> our code to Iceberg-0.12 and incorporate changes to format and
>>>>>>>>>>>>>> other feedback from the community and should be able to make 
>>>>>>>>>>>>>> this MVP
>>>>>>>>>>>>>> implementation available quickly as a PR.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> A few areas that we have not yet worked on and would love for
>>>>>>>>>>>>>> the community to help are:
>>>>>>>>>>>>>> 1. Time travel on views: Be able to access the view as of a
>>>>>>>>>>>>>> version or time
>>>>>>>>>>>>>> 2. History table: A system table implementation for $versions
>>>>>>>>>>>>>> similar to the $snapshots table in order to display the history 
>>>>>>>>>>>>>> of a view
>>>>>>>>>>>>>> 3. Rollback to a version: A way to rollback a view to a
>>>>>>>>>>>>>> previous version
>>>>>>>>>>>>>> 4. Engine agnostic SQL: more below.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> One comment that is worth a broader discussion is the dialect
>>>>>>>>>>>>>> of the SQL stored in the view metadata. The purpose of the spec 
>>>>>>>>>>>>>> is to
>>>>>>>>>>>>>> provide a storage format for view metadata and APIs to access 
>>>>>>>>>>>>>> that
>>>>>>>>>>>>>> metadata. The dialect of the SQL stored is an orthogonal 
>>>>>>>>>>>>>> question and is
>>>>>>>>>>>>>> outside the scope of this spec.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Nonetheless, it is an important concern, so compiling a few
>>>>>>>>>>>>>> suggestions that came up in the comments to continue the 
>>>>>>>>>>>>>> discussion:
>>>>>>>>>>>>>> 1. Allow only ANSI-compliant SQL and anything that is truly
>>>>>>>>>>>>>> common across engines in the view definition (this is how 
>>>>>>>>>>>>>> currently Netflix
>>>>>>>>>>>>>> uses these 'common' views across Spark and Trino)
>>>>>>>>>>>>>> 2. Add a field to the view metadata to identify the dialect
>>>>>>>>>>>>>> of the SQL. This allows for any desired dialect, but no improved
>>>>>>>>>>>>>> cross-engine operability
>>>>>>>>>>>>>> 3. Store AST produced by Calcite in the view metadata and
>>>>>>>>>>>>>> translate back and forth between engine-supported SQL and AST
>>>>>>>>>>>>>> 4. Intermediate structured language of our own. (What
>>>>>>>>>>>>>> additional functionality does it provide over Calcite?)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Given that the view metadata is json, it is easily extendable
>>>>>>>>>>>>>> to incorporate any new fields needed to make the SQL truly 
>>>>>>>>>>>>>> compatible
>>>>>>>>>>>>>> across engines.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> What do you think?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> regards,
>>>>>>>>>>>>>> Anjali
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Tue, Jul 20, 2021 at 3:09 AM Piotr Findeisen <
>>>>>>>>>>>>>> pi...@starburstdata.com> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> FWIW, in Trino we just added Trino views support.
>>>>>>>>>>>>>>> https://github.com/trinodb/trino/pull/8540
>>>>>>>>>>>>>>> Of course, this is by no means usable by other query engines.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Anjali, your document does not talk much about compatibility
>>>>>>>>>>>>>>> between query engines.
>>>>>>>>>>>>>>> How do you plan to address that?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> For example, I am familiar with Coral, and I appreciate its
>>>>>>>>>>>>>>> powers for dealing with legacy stuff like views defined by Hive.
>>>>>>>>>>>>>>> I treat it as a great technology supporting transitioning
>>>>>>>>>>>>>>> from a query engine to a better one.
>>>>>>>>>>>>>>> However, I would not base a design of some new system for
>>>>>>>>>>>>>>> storing cross-engine compatible views on that.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Is there something else we can use?
>>>>>>>>>>>>>>> Maybe the view definition should use some
>>>>>>>>>>>>>>> intermediate structured language that's not SQL?
>>>>>>>>>>>>>>> For example, it could represent logical structure of
>>>>>>>>>>>>>>> operations in semantics manner.
>>>>>>>>>>>>>>> This would eliminate need for cross-engine compatible
>>>>>>>>>>>>>>> parsing and analysis.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Best
>>>>>>>>>>>>>>> PF
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Tue, Jul 20, 2021 at 11:04 AM Ryan Murray <
>>>>>>>>>>>>>>> rym...@gmail.com> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thanks Anjali!
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I have left some comments on the document. I unfortunately
>>>>>>>>>>>>>>>> have to miss the community meetup tomorrow but would love to 
>>>>>>>>>>>>>>>> chat more/help
>>>>>>>>>>>>>>>> w/ implementation.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>> Ryan
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On Tue, Jul 20, 2021 at 7:42 AM Anjali Norwood
>>>>>>>>>>>>>>>> <anorw...@netflix.com.invalid> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Hello,
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> John Zhuge and I would like to propose the following spec
>>>>>>>>>>>>>>>>> for storing view metadata in Iceberg. The proposal has been 
>>>>>>>>>>>>>>>>> implemented [1]
>>>>>>>>>>>>>>>>> and is in production at Netflix for over 15 months.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> https://docs.google.com/document/d/1wQt57EWylluNFdnxVxaCkCSvnWlI8vVtwfnPjQ6Y7aw/edit?usp=sharing
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> [1]
>>>>>>>>>>>>>>>>> https://github.com/Netflix/iceberg/tree/netflix-spark-2.4/view/src/main/java/com/netflix/bdp/view
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Please let us know your thoughts by adding comments to the
>>>>>>>>>>>>>>>>> doc.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>> Anjali.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>
>>>>>> --
>>>>>> Ryan Blue
>>>>>> Tabular
>>>>>>
>>>>> --
>>>>> John Zhuge
>>>>>
>>>>
>>>
>>> --
>>> Ryan Blue
>>> Tabular
>>>
>>
>
> --
> Ryan Blue
> Tabular
>

Reply via email to