Hi Jark, I don't want to limit this interface to LocalAgg Push down. Actually, sometimes, we can push whole aggregation to source too.
So, this rule can do something more advanced. For example, we can push down group sets to source too, for the SQL: "GROUP BY GROUPING SETS (f1, f2)". Then, we need to add more information to push down. Best, Jingsong On Wed, Jan 6, 2021 at 11:02 AM Jark Wu <imj...@gmail.com> wrote: > I think this may be over designed. We should have confidence in the > interface we design, the interface should be stable. > Wrapping things in a big context has a cost of losing user convenience. > Foremost, we don't see any parameters to add in the future. Do you know > any potential parameters? > > Best, > Jark > > On Wed, 6 Jan 2021 at 10:28, Jingsong Li <jingsongl...@gmail.com> wrote: > >> Hi Sebastian, >> >> Well, I mean: >> >> `boolean applyAggregates(int[] groupingFields, List<CallExpression> >> aggregateExpressions, DataType producedDataType);` >> VS >> ``` >> boolean applyAggregates(Aggregation agg); >> >> interface Aggregation { >> int[] groupingFields(); >> List<CallExpression> aggregateExpressions(); >> DataType producedDataType(); >> } >> ``` >> >> Maybe I've over considered it, but I think Aggregation is a complicated >> thing. Maybe we need to extend its parameters in the future, so make the >> parameters interface, which is conducive to the future expansion without >> destroying the compatibility of user implementation. If it is the way >> before, users need to modify the code. >> >> Best, >> Jingsong >> >> On Wed, Jan 6, 2021 at 12:52 AM Sebastian Liu <liuyang0...@gmail.com> >> wrote: >> >>> Hi Jinsong, >>> >>> Thx a lot for your suggestion. These points really need to be clear in >>> the proposal. >>> >>> For the semantic problem, I think the main point is the different >>> returned data types >>> for the target aggregate function and the row format returned by the >>> underlying storage. >>> That's why we provide the producedDataType in the >>> SupportsAggregatePushDown interface. >>> Need to let developers know that we need to handle the semantic >>> differences between >>> the underlying storage system and Flink in related connectors. >>> [Supplemented in proposal] >>> >>> For the phase of the new PushLocalAggIntoTableSourceScanRule rule, it's also >>> a key point. >>> As you suggested, we should put it into the PHYSICAL_REWRITE rule set, >>> and better to put it >>> behind the EnforceLocalXXAggRule. [Supplemented in proposal] >>> >>> For the scalability of the interface, actually I don't exactly >>> understand your suggestion. Is it to add >>> an abstract class, to implement the SupportsAggregatePushDown interface, >>> and holds the >>> `List < CallExpression > aggregateExpressions, int[] GroupingFields, >>> DataType producedDataType` >>> fields? >>> >>> Looking forward to your further feedback or guidance. >>> >>> Jingsong Li <jingsongl...@gmail.com> 于2021年1月5日周二 下午2:44写道: >>> >>>> Thanks for your proposal! Sebastian. >>>> >>>> +1 for SupportsAggregatePushDown. The above wonderful discussion has >>>> solved >>>> many of my concerns. >>>> >>>> ## Semantic problems >>>> >>>> We may need to add some mechanisms or comments, because as far as I >>>> know, >>>> the semantics of each database is actually different, which may need to >>>> be >>>> reflected in your specific implementation. >>>> >>>> For example, the AVG output types of various databases may be different. >>>> For example, MySQL outputs double, this is different from Flink. What >>>> should we do? (Lucky, avg will be splitted into sum and count, But we >>>> also >>>> need care about decimal and others) >>>> >>>> ## The phase of push-down rule >>>> >>>> I strongly recommend that you do not put it in the Volcano phase, which >>>> may >>>> make the cost calculation very troublesome. >>>> So in PHYSICAL_REWRITE? >>>> >>>> ## About interface >>>> >>>> For scalability, I slightly recommend that we introduce an `Aggregate` >>>> interface, it contains `List<CallExpression> aggregateExpressions, int[] >>>> groupingFields, DataType producedDataType` fields. In this way, we can >>>> add >>>> fields easily without breaking compatibility. >>>> >>>> I think the current design is very good, just put forward some ideas. >>>> >>>> Best, >>>> Jingsong >>>> >>>> On Tue, Jan 5, 2021 at 1:55 PM Sebastian Liu <liuyang0...@gmail.com> >>>> wrote: >>>> >>>> > Hi Jark, >>>> > >>>> > Thx for your further feedback and help. The interface of >>>> > SupportsAggregatePushDown may indeed need some adjustments. >>>> > >>>> > For (1) Agree: Yeah, the upstream only need to know if the >>>> TableSource can >>>> > handle all of the aggregates. >>>> > It's better to just return a boolean type to indicate whether all of >>>> > aggregates push down was successful or not. [Resolved in proposal] >>>> > >>>> > For (2) Agree: The aggOutputDataType represent the produced data type >>>> of >>>> > the new table source to make sure that the new table source can >>>> > connect with the related exchange node. The format of this >>>> > aggOutputDataType is groupedFields's type + agg function's return >>>> type. >>>> > The reason for adding this parameter in this function is also to >>>> facilitate >>>> > the user to build the final output type. I have changed this parameter >>>> > to be producedDataType. [Resolved in proposal] >>>> > >>>> > For (3) Agree: Indeed, groupSet may mislead users, I have changed to >>>> use >>>> > groupingFields. [Resolved in proposal] >>>> > >>>> > Thx again for the suggestion, looking for the further discussion. >>>> > >>>> > Jark Wu <imj...@gmail.com> 于2021年1月5日周二 下午12:05写道: >>>> > >>>> > > I'm also +1 for idea#2. >>>> > > >>>> > > Regarding to the updated interface, >>>> > > >>>> > > Result applyAggregates(List<CallExpression> aggregateExpressions, >>>> > > int[] groupSet, DataType aggOutputDataType); >>>> > > >>>> > > final class Result { >>>> > > private final List<CallExpression> acceptedAggregates; >>>> > > private final List<CallExpression> remainingAggregates; >>>> > > } >>>> > > >>>> > > I have following comments: >>>> > > >>>> > > 1) Do we need the composite Result return type? Is a boolean return >>>> type >>>> > > enough? >>>> > > From my understanding, all of the aggregates should be accepted, >>>> > > otherwise the pushdown should fail. >>>> > > Therefore, users don't need to distinguish which aggregates are >>>> > > "accepted". >>>> > > >>>> > > 2) Does the `aggOutputDataType` represent the produced data type of >>>> the >>>> > > new source, or just the return type of all the agg functions? >>>> > > I would prefer to `producedDataType` just like >>>> > > `SupportsReadingMetadata` to reduce the effort for users to concat a >>>> > final >>>> > > output type. >>>> > > The return type of each agg function can be obtained from the >>>> > > `CallExpression`. >>>> > > >>>> > > 3) What do you think about renaming `groupSet` to `grouping` or >>>> > > `groupedFields` ? >>>> > > The `groupSet` may confuse users that it relates to "grouping >>>> sets". >>>> > > >>>> > > >>>> > > What do you think? >>>> > > >>>> > > Best, >>>> > > Jark >>>> > > >>>> > > >>>> > > >>>> > > On Tue, 5 Jan 2021 at 11:04, Kurt Young <ykt...@gmail.com> wrote: >>>> > > >>>> > >> Sorry for the typo -_-! >>>> > >> I meant idea #2. >>>> > >> >>>> > >> Best, >>>> > >> Kurt >>>> > >> >>>> > >> >>>> > >> On Tue, Jan 5, 2021 at 10:59 AM Sebastian Liu < >>>> liuyang0...@gmail.com> >>>> > >> wrote: >>>> > >> >>>> > >>> Hi Kurt, >>>> > >>> >>>> > >>> Thx a lot for your feedback. If local aggregation is more like a >>>> > >>> physical operator rather than logical >>>> > >>> operator, I think your suggestion should be idea #2 which handle >>>> all in >>>> > >>> the physical optimization phase? >>>> > >>> >>>> > >>> Looking forward for the further discussion. >>>> > >>> >>>> > >>> >>>> > >>> Kurt Young <ykt...@gmail.com> 于2021年1月5日周二 上午9:52写道: >>>> > >>> >>>> > >>>> Local aggregation is more like a physical operator rather than >>>> logical >>>> > >>>> operator. I would suggest going with idea #1. >>>> > >>>> >>>> > >>>> Best, >>>> > >>>> Kurt >>>> > >>>> >>>> > >>>> >>>> > >>>> On Wed, Dec 30, 2020 at 8:31 PM Sebastian Liu < >>>> liuyang0...@gmail.com> >>>> > >>>> wrote: >>>> > >>>> >>>> > >>>> > Hi Jark, Thx a lot for your quick reply and valuable >>>> suggestions. >>>> > >>>> > For (1): Agree: Since we are in the period of upgrading the new >>>> > table >>>> > >>>> > source api, >>>> > >>>> > we really should consider the new interface for the new >>>> optimize >>>> > >>>> rule. If >>>> > >>>> > the new rule >>>> > >>>> > doesn't use the new api, we'll have to upgrade it sooner or >>>> later. I >>>> > >>>> have >>>> > >>>> > change to use >>>> > >>>> > the ability interface for the SupportsAggregatePushDown >>>> definition >>>> > in >>>> > >>>> above >>>> > >>>> > proposal. >>>> > >>>> > >>>> > >>>> > For (2): Agree: Change to use CallExpression is a better >>>> choice, and >>>> > >>>> have >>>> > >>>> > resolved this >>>> > >>>> > comment in the proposal. >>>> > >>>> > >>>> > >>>> > For (3): I suggest we first support the JDBC connector, as we >>>> don't >>>> > >>>> have >>>> > >>>> > Druid connector >>>> > >>>> > and ES connector just has sink api at present. >>>> > >>>> > >>>> > >>>> > But perhaps the biggest question may be whether we should use >>>> idea 1 >>>> > >>>> or >>>> > >>>> > idea 2 in proposal. >>>> > >>>> > >>>> > >>>> > What do you think? After we reach the agreement on the >>>> proposal, >>>> > our >>>> > >>>> team >>>> > >>>> > can drive to >>>> > >>>> > complete this feature. >>>> > >>>> > >>>> > >>>> > Jark Wu <imj...@gmail.com> 于2020年12月29日周二 下午2:58写道: >>>> > >>>> > >>>> > >>>> > > Hi Sebastian, >>>> > >>>> > > >>>> > >>>> > > Thanks for the proposal. I think this is a great improvement >>>> for >>>> > >>>> Flink >>>> > >>>> > SQL. >>>> > >>>> > > I went through the design doc and have following thoughts: >>>> > >>>> > > >>>> > >>>> > > 1) Flink has deprecated the legacy TableSource in 1.11 and >>>> > proposed >>>> > >>>> a new >>>> > >>>> > > set of DynamicTableSource interfaces. Could you update your >>>> > >>>> proposal to >>>> > >>>> > > use the new interfaces? >>>> > >>>> > > Follow the existing ability interfaces, e.g. >>>> > >>>> > > SupportsFilterPushDown, SupportsProjectionPushDown. >>>> > >>>> > > >>>> > >>>> > > 2) Personally, I think CallExpression would be a better >>>> > >>>> representation >>>> > >>>> > than >>>> > >>>> > > separate `FunctionDefinition` and args. Because, it would be >>>> > easier >>>> > >>>> to >>>> > >>>> > know >>>> > >>>> > > what's the index and type of the arguments. >>>> > >>>> > > >>>> > >>>> > > 3) It would be better to list which connectors will be >>>> supported >>>> > in >>>> > >>>> the >>>> > >>>> > > plan? >>>> > >>>> > > >>>> > >>>> > > Best, >>>> > >>>> > > Jark >>>> > >>>> > > >>>> > >>>> > > >>>> > >>>> > > On Tue, 29 Dec 2020 at 00:49, Sebastian Liu < >>>> > liuyang0...@gmail.com> >>>> > >>>> > wrote: >>>> > >>>> > > >>>> > >>>> > > > Hi all, >>>> > >>>> > > > >>>> > >>>> > > > I'd like to discuss a new feature for the Blink Planner. >>>> > >>>> > > > Aggregate operator of Flink SQL is currently fully done at >>>> Flink >>>> > >>>> layer. >>>> > >>>> > > > With the developing of storage, many downstream storage of >>>> Flink >>>> > >>>> SQL >>>> > >>>> > has >>>> > >>>> > > > the ability to deal with Aggregation operator. >>>> > >>>> > > > Pushing down Aggregate to data source layer will improve >>>> > >>>> performance >>>> > >>>> > from >>>> > >>>> > > > the perspective of the network IO and computation overhead. >>>> > >>>> > > > >>>> > >>>> > > > I have drafted a design doc for this new feature. >>>> > >>>> > > > >>>> > >>>> > > > >>>> > >>>> > > >>>> > >>>> > >>>> > >>>> >>>> > >>>> https://docs.google.com/document/d/1kGwC_h4qBNxF2eMEz6T6arByOB8yilrPLqDN0QBQXW4/edit?usp=sharing >>>> > >>>> > > > >>>> > >>>> > > > Any comment or discussion is welcome. >>>> > >>>> > > > >>>> > >>>> > > > -- >>>> > >>>> > > > >>>> > >>>> > > > *With kind regards >>>> > >>>> > > > >>>> ------------------------------------------------------------ >>>> > >>>> > > > Sebastian Liu 刘洋 >>>> > >>>> > > > Institute of Computing Technology, Chinese Academy of >>>> Science >>>> > >>>> > > > Mobile\WeChat: +86—15201613655 >>>> > >>>> > > > E-mail: liuyang0...@gmail.com <liuyang0...@gmail.com> >>>> > >>>> > > > QQ: 3239559* >>>> > >>>> > > > >>>> > >>>> > > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > -- >>>> > >>>> > >>>> > >>>> > *With kind regards >>>> > >>>> > ------------------------------------------------------------ >>>> > >>>> > Sebastian Liu 刘洋 >>>> > >>>> > Institute of Computing Technology, Chinese Academy of Science >>>> > >>>> > Mobile\WeChat: +86—15201613655 >>>> > >>>> > E-mail: liuyang0...@gmail.com <liuyang0...@gmail.com> >>>> > >>>> > QQ: 3239559* >>>> > >>>> > >>>> > >>>> >>>> > >>> >>>> > >>> >>>> > >>> -- >>>> > >>> >>>> > >>> *With kind regards >>>> > >>> ------------------------------------------------------------ >>>> > >>> Sebastian Liu 刘洋 >>>> > >>> Institute of Computing Technology, Chinese Academy of Science >>>> > >>> Mobile\WeChat: +86—15201613655 >>>> > >>> E-mail: liuyang0...@gmail.com <liuyang0...@gmail.com> >>>> > >>> QQ: 3239559* >>>> > >>> >>>> > >>> >>>> > >>>> > -- >>>> > >>>> > *With kind regards >>>> > ------------------------------------------------------------ >>>> > Sebastian Liu 刘洋 >>>> > Institute of Computing Technology, Chinese Academy of Science >>>> > Mobile\WeChat: +86—15201613655 >>>> > E-mail: liuyang0...@gmail.com <liuyang0...@gmail.com> >>>> > QQ: 3239559* >>>> > >>>> >>>> >>>> -- >>>> Best, Jingsong Lee >>>> >>> >>> >>> -- >>> >>> *With kind regards >>> ------------------------------------------------------------ >>> Sebastian Liu 刘洋 >>> Institute of Computing Technology, Chinese Academy of Science >>> Mobile\WeChat: +86—15201613655 >>> E-mail: liuyang0...@gmail.com <liuyang0...@gmail.com> >>> QQ: 3239559* >>> >>> >> >> -- >> Best, Jingsong Lee >> > -- Best, Jingsong Lee