Hi, Xiaowei, Thanks for bring up the discuss of Table API Enhancement Outline !
I quickly looked at the overall content, these are good expressions of our offline discussions. But from the points of my view, we should add the usage of public interfaces that we will introduce in this propose. So, I added the following usage description of interface and operators in google doc: 1. Map Operator Map operator is a new operator of Table, Map operator can apply a scalar function, and can return multi-column. The usage as follows: val res = tab .map(fun: ScalarFunction).as(‘a, ‘b, ‘c) .select(‘a, ‘c) 2. FlatMap Operator FaltMap operator is a new operator of Table, FlatMap operator can apply a table function, and can return multi-row. The usage as follows: val res = tab .flatMap(fun: TableFunction).as(‘a, ‘b, ‘c) .select(‘a, ‘c) 3. Agg Operator Agg operator is a new operator of Table/GroupedTable, Agg operator can apply a aggregate function, and can return multi-column. The usage as follows: val res = tab .groupBy(‘a) // leave groupBy-Clause out to define global aggregates .agg(fun: AggregateFunction).as(‘a, ‘b, ‘c) .select(‘a, ‘c) 4. FlatAgg Operator FlatAgg operator is a new operator of Table/GroupedTable, FaltAgg operator can apply a table aggregate function, and can return multi-row. The usage as follows: val res = tab .groupBy(‘a) // leave groupBy-Clause out to define global table aggregates .flatAgg(fun: TableAggregateFunction).as(‘a, ‘b, ‘c) .select(‘a, ‘c) 5. TableAggregateFunction The behavior of table aggregates is most like GroupReduceFunction did, which computed for a group of elements, and output a group of elements. The TableAggregateFunction can be applied on GroupedTable.flatAgg() . The interface of TableAggregateFunction has a lot of content, so I don't copy it here, Please look at the detail in google doc: https://docs.google.com/document/d/19rVeyqveGtV33UZt72GV-DP2rLyNlfs0QNGG0xWjayY/edit I will be very appreciate to anyone for reviewing and commenting. Best, Jincheng