个人可以建论坛网站吗,西安云英网站建设,做网站主色调选择,wordpress最好的编辑器下载Flink系列之#xff1a;Over聚合 一、Over聚合二、ORDER BY三、PARTITION BY四、范围#xff08;RANGE#xff09;定义五、RANGE 间隔六、ROW 间隔 适用于流、批
一、Over聚合
OVER 聚合通过排序后的范围数据为每行输入计算出聚合值。和 GROUP BY 聚合不同#xff0c; OV… Flink系列之Over聚合 一、Over聚合二、ORDER BY三、PARTITION BY四、范围RANGE定义五、RANGE 间隔六、ROW 间隔 适用于流、批
一、Over聚合
OVER 聚合通过排序后的范围数据为每行输入计算出聚合值。和 GROUP BY 聚合不同 OVER 聚合不会把结果通过分组减少到一行它会为每行输入增加一个聚合值。
下面这个查询为每个订单计算前一个小时之内接收到的同一产品所有订单的总金额。
SELECT order_id, order_time, amount,SUM(amount) OVER (PARTITION BY productORDER BY order_timeRANGE BETWEEN INTERVAL 1 HOUR PRECEDING AND CURRENT ROW) AS one_hour_prod_amount_sum
FROM Orders这个Flink SQL查询的目标是基于给定的订单数据计算每个订单的订单时间之前一个小时内同一产品的总销售金额。
首先我们选择了order_id、order_time和amount这三个列。然后我们使用SUM(amount) OVER (PARTITION BY product ORDER BY order_time RANGE BETWEEN INTERVAL ‘1’ HOUR PRECEDING AND CURRENT ROW)函数来计算每个订单的订单时间之前一个小时内同一产品的销售金额总和。在函数中我们使用了PARTITION BY子句来指定按产品进行分区即对每个产品分别计算销售金额总和。然后我们使用ORDER BY子句来指定按订单时间进行排序以确保计算的是订单时间之前的销售金额。最后我们使用RANGE BETWEEN INTERVAL ‘1’ HOUR PRECEDING AND CURRENT ROW来指定计算的范围为订单时间之前一个小时到当前行当前订单。这个查询的结果将为每个订单提供订单时间之前一个小时内同一产品的销售金额总和。
下面总结了 OVER 窗口的语法
SELECTagg_func(agg_col) OVER ([PARTITION BY col1[, col2, ...]]ORDER BY time_colrange_definition),...
FROM ...你可以在一个 SELECT 子句中定义多个 OVER 窗口聚合。然而对于流式查询由于目前的限制所有聚合的 OVER 窗口必须是相同的。
二、ORDER BY
OVER 窗口需要数据是有序的。因为表没有固定的排序所以 ORDER BY 子句是强制的。对于流式查询Flink 目前只支持 OVER 窗口定义在升序asc的 时间属性 上。其他的排序不支持。
三、PARTITION BY
OVER 窗口可以定义在一个分区表上。PARTITION BY 子句代表着每行数据只在其所属的数据分区进行聚合。
四、范围RANGE定义
范围RANGE定义指定了聚合中包含了多少行数据。范围通过 BETWEEN 子句定义上下边界其内的所有行都会聚合。Flink 只支持 CURRENT ROW 作为上边界。
有两种方法可以定义范围ROWS 间隔 和 RANGE 间隔
五、RANGE 间隔
RANGE 间隔是定义在排序列值上的在 Flink 里排序列总是一个时间属性。下面的 RANG 间隔定义了聚合会在比当前行的时间属性小 30 分钟的所有行上进行。
RANGE BETWEEN INTERVAL 30 MINUTE PRECEDING AND CURRENT ROW六、ROW 间隔
ROWS 间隔基于计数。它定义了聚合操作包含的精确行数。下面的 ROWS 间隔定义了当前行 之前的 10 行也就是11行都会被聚合。
ROWS BETWEEN 10 PRECEDING AND CURRENT ROW
WINDOWWINDOW 子句可用于在 SELECT 子句之外定义 OVER 窗口。它让查询可读性更好也允许多个聚合共用一个窗口定义。
SELECT order_id, order_time, amount,SUM(amount) OVER w AS sum_amount,AVG(amount) OVER w AS avg_amount
FROM Orders
WINDOW w AS (PARTITION BY productORDER BY order_timeRANGE BETWEEN INTERVAL 1 HOUR PRECEDING AND CURRENT ROW)这个Flink SQL查询的目标是在给定的订单数据上计算每个订单的订单时间之前一个小时内同一产品的销售金额总和和平均销售金额。
首先我们选择了order_id、order_time和amount这三个列。
然后我们使用SUM(amount) OVER w和AVG(amount) OVER w函数分别计算每个订单的订单时间之前一个小时内同一产品的销售金额总和和平均销售金额。在函数中我们定义了一个窗口w使用WINDOW关键字来指定。窗口w使用了PARTITION BY子句按产品进行分区并使用ORDER BY子句按订单时间进行排序。这样可以确保计算的是订单时间之前的销售金额。窗口w还使用了RANGE BETWEEN INTERVAL ‘1’ HOUR PRECEDING AND CURRENT ROW来指定计算的范围为订单时间之前一个小时到当前行当前订单。最后通过将计算结果作为新的列名sum_amount和avg_amount我们将计算的销售金额总和和平均销售金额添加到了查询结果中。这个查询的结果将包含每个订单的订单时间和销售金额以及每个订单的订单时间之前一个小时内同一产品的销售金额总和和平均销售金额。