FlinkSQL 窗口使用问题

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

FlinkSQL 窗口使用问题

Roc Marshal
Hi,




SELECT

TUMBLE_START(ts, INTERVAL '1' day) as window_start,

TUMBLE_END(ts, INTERVAL '1' day) as window_end,

c1,

sum(c2) as sc2

FROM sourcetable

GROUP BY TUMBLE(ts, INTERVAL '1' day), c1

ORDER BY window_start, sc2 desc limit 10


这个sql希望能够以一天为窗口(翻滚)进行计算窗口  按照c1分组,并对c2列求和(sc2)后对sc2进行窗口内排序。但是结果看起来,结果集中窗口内的数据列sc2并没有有序(降序/或者升序)排列。
能不能根据我的需求和sql的写法诊断一下问题出在哪里?或者说给一下建议,好让我定位到自己对flinksql使用的误区在哪?


谢谢!


Best Roc.
Reply | Threaded
Open this post in threaded view
|

Re:FlinkSQL 窗口使用问题

hailongwang
Hi Roc,
这边涉及到 order by 和 limit 一起使用时如何执行的问题。
1. 只对找到 limit n 的数据后,然后进行 order by,并不是对所有的数据;
2. 对所有的数据进行 order by 后,再 limit;
目前看 flink 对 `StreamExecSortLimit` 只保证输出 limit n,但是不保证输出的 limit n 是排序的。
如果业务允许的话,可以在 limit 后面加个 offset,这样可以使用 `emitRecordsWithRowNumber`,保证 limit n 最后是 order by 的。
个人觉得 应该将 `StreamExecSortLimit` 的 `outputRankNumber` 设置为true。
不知道理解的对不对,CC @Jark @ godfrey




Best,
Hailong Wang




在 2020-10-22 10:09:09,"Roc Marshal" <[hidden email]> 写道:

>Hi,
>
>
>
>
>SELECT
>
>TUMBLE_START(ts, INTERVAL '1' day) as window_start,
>
>TUMBLE_END(ts, INTERVAL '1' day) as window_end,
>
>c1,
>
>sum(c2) as sc2
>
>FROM sourcetable
>
>GROUP BY TUMBLE(ts, INTERVAL '1' day), c1
>
>ORDER BY window_start, sc2 desc limit 10
>
>
>这个sql希望能够以一天为窗口(翻滚)进行计算窗口  按照c1分组,并对c2列求和(sc2)后对sc2进行窗口内排序。但是结果看起来,结果集中窗口内的数据列sc2并没有有序(降序/或者升序)排列。
>能不能根据我的需求和sql的写法诊断一下问题出在哪里?或者说给一下建议,好让我定位到自己对flinksql使用的误区在哪?
>
>
>谢谢!
>
>
>Best Roc.
Reply | Threaded
Open this post in threaded view
|

Re: FlinkSQL 窗口使用问题

Jark
Administrator
目前确实不支持。将来可以结合 FLIP-145 window TVF 语法来支持 [1]。


[1]:
https://cwiki.apache.org/confluence/display/FLINK/FLIP-145%3A+Support+SQL+windowing+table-valued+function

Best,
Jark

On Fri, 23 Oct 2020 at 00:35, hailongwang <[hidden email]> wrote:

> Hi Roc,
> 这边涉及到 order by 和 limit 一起使用时如何执行的问题。
> 1. 只对找到 limit n 的数据后,然后进行 order by,并不是对所有的数据;
> 2. 对所有的数据进行 order by 后,再 limit;
> 目前看 flink 对 `StreamExecSortLimit` 只保证输出 limit n,但是不保证输出的 limit n 是排序的。
> 如果业务允许的话,可以在 limit 后面加个 offset,这样可以使用 `emitRecordsWithRowNumber`,保证 limit
> n 最后是 order by 的。
> 个人觉得 应该将 `StreamExecSortLimit` 的 `outputRankNumber` 设置为true。
> 不知道理解的对不对,CC @Jark @ godfrey
>
>
> Best,
> Hailong Wang
>
>
> 在 2020-10-22 10:09:09,"Roc Marshal" <[hidden email]> 写道:
> >Hi,
> >
> >
> >
> >
> >SELECT
> >
> >TUMBLE_START(ts, INTERVAL '1' day) as window_start,
> >
> >TUMBLE_END(ts, INTERVAL '1' day) as window_end,
> >
> >c1,
> >
> >sum(c2) as sc2
> >
> >FROM sourcetable
> >
> >GROUP BY TUMBLE(ts, INTERVAL '1' day), c1
> >
> >ORDER BY window_start, sc2 desc limit 10
> >
> >
> >这个sql希望能够以一天为窗口(翻滚)进行计算窗口  按照c1分组,并对c2列求和(sc2)后对sc2进行窗口内排序。但是结果看起来,结果集中窗口内的数据列sc2并没有有序(降序/或者升序)排列。
> >能不能根据我的需求和sql的写法诊断一下问题出在哪里?或者说给一下建议,好让我定位到自己对flinksql使用的误区在哪?
> >
> >
> >谢谢!
> >
> >
> >Best Roc.
>
>
>
>
>
>