html5可以做交互网站吗,找工作的平台,郑州好的网站设计公司,商城网站如何优化Flink系列之#xff1a;窗口Top-N 一、窗口Top-N二、示例#xff1a;在窗口聚合后进行窗口 Top-N三、在窗口表值函数后进行窗口 Top-N四、限制 一、窗口Top-N
适用于流、批一体窗口 Top-N 是特殊的 Top-N#xff0c;它返回每个分区键的每个窗口的N个最小或最大值。与普通To… Flink系列之窗口Top-N 一、窗口Top-N二、示例在窗口聚合后进行窗口 Top-N三、在窗口表值函数后进行窗口 Top-N四、限制 一、窗口Top-N
适用于流、批一体窗口 Top-N 是特殊的 Top-N它返回每个分区键的每个窗口的N个最小或最大值。与普通Top-N不同窗口Top-N只在窗口最后返回汇总的Top-N数据不会产生中间结果。窗口 Top-N 会在窗口结束后清除不需要的中间状态。 因此窗口 Top-N 适用于用户不需要每条数据都更新Top-N结果的场景相对普通Top-N来说性能更好。通常窗口 Top-N 直接用于 窗口表值函数上。 另外窗口 Top-N 可以用于基于 窗口表值函数 的操作之上比如 窗口聚合窗口 Top-N 和 窗口关联。窗口 Top-N 的语法和普通的 Top-N 相同。除此之外窗口 Top-N 需要 PARTITION BY 子句包含 窗口表值函数 或 窗口聚合 产生的 window_start 和 window_end。 否则优化器无法翻译。
下面展示了窗口 Top-N 的语法
SELECT [column_list]
FROM (SELECT [column_list],ROW_NUMBER() OVER (PARTITION BY window_start, window_end [, col_key1...]ORDER BY col1 [asc|desc][, col2 [asc|desc]...]) AS rownumFROM table_name) -- relation applied windowing TVF
WHERE rownum N [AND conditions]二、示例在窗口聚合后进行窗口 Top-N
下面的示例展示了在10分钟的滚动窗口上计算销售额位列前三的供应商。
-- tables must have time attribute, e.g. bidtime in this table
Flink SQL desc Bid;
-----------------------------------------------------------------------------------------
| name | type | null | key | extras | watermark |
-----------------------------------------------------------------------------------------
| bidtime | TIMESTAMP(3) *ROWTIME* | true | | | bidtime - INTERVAL 1 SECOND |
| price | DECIMAL(10, 2) | true | | | |
| item | STRING | true | | | |
| supplier_id | STRING | true | | | |
-----------------------------------------------------------------------------------------Flink SQL SELECT * FROM Bid;
--------------------------------------------
| bidtime | price | item | supplier_id |
--------------------------------------------
| 2020-04-15 08:05 | 4.00 | A | supplier1 |
| 2020-04-15 08:06 | 4.00 | C | supplier2 |
| 2020-04-15 08:07 | 2.00 | G | supplier1 |
| 2020-04-15 08:08 | 2.00 | B | supplier3 |
| 2020-04-15 08:09 | 5.00 | D | supplier4 |
| 2020-04-15 08:11 | 2.00 | B | supplier3 |
| 2020-04-15 08:13 | 1.00 | E | supplier1 |
| 2020-04-15 08:15 | 3.00 | H | supplier2 |
| 2020-04-15 08:17 | 6.00 | F | supplier5 |
--------------------------------------------Flink SQL SELECT *FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY price DESC) as rownumFROM (SELECT window_start, window_end, supplier_id, SUM(price) as price, COUNT(*) as cntFROM TABLE(TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL 10 MINUTES))GROUP BY window_start, window_end, supplier_id)) WHERE rownum 3;
---------------------------------------------------------------------
| window_start | window_end | supplier_id | price | cnt | rownum |
---------------------------------------------------------------------
| 2020-04-15 08:00 | 2020-04-15 08:10 | supplier1 | 6.00 | 2 | 1 |
| 2020-04-15 08:00 | 2020-04-15 08:10 | supplier4 | 5.00 | 1 | 2 |
| 2020-04-15 08:00 | 2020-04-15 08:10 | supplier2 | 4.00 | 1 | 3 |
| 2020-04-15 08:10 | 2020-04-15 08:20 | supplier5 | 6.00 | 1 | 1 |
| 2020-04-15 08:10 | 2020-04-15 08:20 | supplier2 | 3.00 | 1 | 2 |
| 2020-04-15 08:10 | 2020-04-15 08:20 | supplier3 | 2.00 | 1 | 3 |
---------------------------------------------------------------------注意 为了更好地理解窗口行为这里把 timestamp 值后面的0去掉了。例如在 Flink SQL Client 中如果类型是 TIMESTAMP(3) 2020-04-15 08:05 应该显示成 2020-04-15 08:05:00.000 。
这条Flink SQL查询的目标是在表Bid中根据时间窗口对数据进行分组并找出每个窗口内价格最高的三个供应商。
首先在FROM子句中使用TUMBLE函数对Bid表进行分区每个分区的时间窗口大小为10分钟并指定bidtime作为分区依据。然后将其结果作为内部查询的输入表。在内部查询中使用GROUP BY子句将数据按窗口的开始时间window_start、结束时间window_end和供应商IDsupplier_id进行分组。并计算每个分组的价格总和SUM(price)和行数COUNT(*)。同时使用ROW_NUMBER()函数在每个窗口分组内按价格降序排列并为每行分配一个行号rownum。最后在外部查询中筛选出行号(rownum)小于等于3的记录并返回窗口的开始时间、结束时间、供应商ID、价格总和、行数和行号。最终的查询结果将包括每个窗口内价格最高的三个供应商的信息。
三、在窗口表值函数后进行窗口 Top-N
下面的示例展示了在10分钟的滚动窗口上计算价格位列前三的数据。
Flink SQL SELECT *FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY price DESC) as rownumFROM TABLE(TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL 10 MINUTES))) WHERE rownum 3;
----------------------------------------------------------------------------------------
| bidtime | price | item | supplier_id | window_start | window_end | rownum |
----------------------------------------------------------------------------------------
| 2020-04-15 08:05 | 4.00 | A | supplier1 | 2020-04-15 08:00 | 2020-04-15 08:10 | 2 |
| 2020-04-15 08:06 | 4.00 | C | supplier2 | 2020-04-15 08:00 | 2020-04-15 08:10 | 3 |
| 2020-04-15 08:09 | 5.00 | D | supplier4 | 2020-04-15 08:00 | 2020-04-15 08:10 | 1 |
| 2020-04-15 08:11 | 2.00 | B | supplier3 | 2020-04-15 08:10 | 2020-04-15 08:20 | 3 |
| 2020-04-15 08:15 | 3.00 | H | supplier2 | 2020-04-15 08:10 | 2020-04-15 08:20 | 2 |
| 2020-04-15 08:17 | 6.00 | F | supplier5 | 2020-04-15 08:10 | 2020-04-15 08:20 | 1 |
----------------------------------------------------------------------------------------注意 为了更好地理解窗口行为这里把 timestamp 值后面的0去掉了。例如在 Flink SQL Client 中如果类型是 TIMESTAMP(3) 2020-04-15 08:05 应该显示成 2020-04-15 08:05:00.000 。
这个Flink SQL语句的目标是从表Bid中选择特定的列并为每个时间窗口内的数据分配一个行号rownum。行号的分配是基于每个窗口内数据的价格进行降序排列。
首先在内部查询中使用TUMBLE函数将Bid表按照bidtime进行分区每个分区代表一个时间窗口窗口大小为10分钟。然后将分区结果作为输入表。接下来在内部查询中使用ROW_NUMBER()函数为每个窗口分组内的数据分配行号。PARTITION BY子句指定按窗口开始时间window_start和结束时间window_end进行分组ORDER BY子句指定按价格price降序排列。这样每个时间窗口内的数据就会被分配一个行号。最后在外部查询中筛选出行号rownum小于等于3的记录这意味着只保留每个时间窗口内前三个价格最高的数据。最终的查询结果将包括原始表中的所有列以及每个时间窗口的开始时间、结束时间和行号。这样就可以查看每个窗口内价格最高的前三个数据同时保留其他列的信息。
四、限制
目前Flink只支持在滚动滑动和累计 窗口表值函数后进行窗口 Top-N。基于会话窗口的Top-N将在将来版本中支持。