几个常用的和基本的数据库sql差不多的:SELECT,WHERE,DISTINCT,GROUP BY,UNION,UNION ALL,JOIN,LEFT JOIN,RIGHT JOIN以及FULL JOIN
Window:根据窗口的不同我们大致可以划分为以下几种窗口
Tumble Window:滚动窗口,窗口数据有固定的大小,窗口数据无限叠加
基本语法:
SELECT
[gk],
[TUMBLE_START(timeCol, size)],
[TUMBLE_END(timeCol, size)],
agg1(col1),
...
aggn(colN)
FROM Tab1
GROUP BY [gk], TUMBLE(timeCol, size)
(1)TUMBLE_START表示了窗口开始的时间;
(2)TUMBLE_END表示了窗口结束的时间;
(3)timeCol表示流表中的时间字段;(4)size表示窗口的大小,如秒、分、时、天等
举例:假如我们需要计算每个人每天的订单量,按照user进行聚合分组
SELECT user
,TUMBLE_START(rowtime,INTERVAL '1' DAY) AS Wstart
,SUM(amount)
FROM Orders
GROUP BY user,TUMBLE_START(rowtime,INTERVAL '1' DAY);
Hop Window:滑动窗口,窗口同样有固定的大小,但是与滚动窗口不同的是滑动窗口可以通过控制参数Side来控制滑动窗口的新建频率,因此当slide的值小于窗口的大小size的时候, 会出现窗口重叠的情况
基本语法
SELECT
[gk],
[HOP_START(timeCol, slide, size)] ,
[HOP_END(timeCol, slide, size)],
agg1(col1),
...
aggN(colN)
FROM Tab1
GROUP BY [gk], HOP(timeCol, slide, size)
(1)HOP_START表示窗口开始的时间;
(2)HOP_END表示窗口结束的时间;
(3)timeCol表示流表中的时间字段;
(4)size表示窗口的大小,如秒、分、时、天等;
(5)slide表示每次滑动的大小
举例:每过一小时计算过去24小时的销量
SELECT product
,SUM(amount)
FROM Orders
GROUP BY product,HOP(rowtime,INTERVAL '1' HOUR,INTERVAL '1' DAY);
Session Window:会话窗口,会话窗口没有持续大的时间,但是他们的下限由internal不活动的时间定义,如果在定义的时间内没有会话出线,那么关闭窗口
基本语法
SELECT
[gk],
SESSION_START(timeCol, gap) AS winStart,
SESSION_END(timeCol, gap) AS winEnd,
agg1(col1),
...
aggn(colN)
FROM Tab1
GROUP BY [gk], SESSION(timeCol, gap)
(1)SESSION_START表示窗口开始的时间;
(2)SESSION_END表示窗口结束的时间;
(3)timeCol表示流表中的时间字段;
(4)gap表示窗口非活跃周期的时长
举例:计算每个用户访问时间12小时内的订单量
SELECT user
,SESSION_START(rowtime,INTERVAL '12' HOUR) AS Start
,SESSION_ROWTIME(rowtime,INTERVAL '12' HOUR) AS End
,SUM(amount)
FROM Orders
GROUP BY SESSION(rowtime, INTERVAL '12' HOUR),user
1.13之后flink窗口使用windowing TVFs
窗口TVF的返回值是一个新的关系,它包括原逻辑中的所有的列,同时还多出来3列,分别是"window_start","window_end"和"window_time",用着3个列以指示分配的窗口。
滚动窗口的格式
TUMBLE(TABLE data, DESCRIPTOR(timecol), size)
- data 表名
- timecol 时间属性字段
- 时间窗口的大小 INTERVAL '10' MINUTES
测试样例:
Flink SQL> desc user_log;
+-------------+-----------------------------+-------+-----+---------------+----------------------------+
| name | type | null | key | extras | watermark |
+-------------+-----------------------------+-------+-----+---------------+----------------------------+
| user_id | STRING | true | | | |
| item_id | STRING | true | | | |
| category_id | STRING | true | | | |
| behavior | STRING | true | | | |
| ts | TIMESTAMP(3) *ROWTIME* | true | | | `ts` - INTERVAL '5' SECOND |
| proctime | TIMESTAMP_LTZ(3) *PROCTIME* | false | | AS PROCTIME() | |
+-------------+-----------------------------+-------+-----+---------------+----------------------------+
6 rows in set
1.窗口函数不允许单独使用,需要和聚合函数搭配使用,且必须按照window_start和window_end进行分区
SELECT window_start, window_end, count(user_id)
FROM TABLE(TUMBLE(TABLE user_log, DESCRIPTOR(ts), INTERVAL '1' MINUTES))
GROUP BY window_start, window_end;
滑动窗口的格式
HOP(TABLE data, DESCRIPTOR(timecol), slide, size [, offset ])
- data 表
- timecol 时间字段
- slide 滑动长度
- size 窗口大小
1.一个滑动窗口,窗口长度是1分钟,滑动大的距离是30s
SELECT window_start, window_end, count(1)
FROM TABLE(
HOP(TABLE user_log, DESCRIPTOR(ts), INTERVAL '30' SECONDS, INTERVAL '1' MINUTES))
GROUP BY window_start, window_end;
累计窗口
CUMULATE(TABLE data, DESCRIPTOR(timecol), step, size)
- data 表
- timecol 时间字段
- step 步长
- size 窗口大小
1.每隔30秒统计最近1分钟的数据量
SELECT window_start, window_end, count(1)
FROM TABLE(
CUMULATE(TABLE user_log, DESCRIPTOR(ts), INTERVAL '30' SECONDS, INTERVAL '1' MINUTES))
GROUP BY window_start, window_end;
窗口聚合我们可以采用GROUP BY GROUPING SETS使用,使用方法我们可以参考官网同时在hive中我们有记载
时间属性的介绍
处理时间:处理时间是基于本地的机器时间来处理数据,他是最简单的时间概念,但是他提供很大的不确定性.这种方式既不需要从数据中获取时间也不需要生成watermark
创建表的时候用DDL的方式定义,用PROCTIME()的方式就可以定义处理时间,函数PROCTIME()返回的数据类型时TIMESTAMP_LTZ
CREATE TABLE user_actions (
user_name STRING,
data STRING,
user_action_time AS PROCTIME() -- 声明一个额外的列作为处理时间属性
) WITH (
...
);
事件时间:事件时间允许程序按照数据中包含的时间来处理,这样可以在有乱序或者晚到的数据的情况下产生一致的处理结果
使用事件时间需要定义watermark
CREATE TABLE user_actions (
user_name STRING,
data STRING,
user_action_time TIMESTAMP(3),
-- 声明 user_action_time 是事件时间属性,并且用 延迟 5 秒的策略来生成 watermark
WATERMARK FOR user_action_time AS user_action_time - INTERVAL '5' SECOND
) WITH (
...
);
Flink EventTime语义
众所周知,再流计算中时间是一个非常重要的概念,Flink中的语义主要包括以下三种 EventTime,ProcessingTime,IngestionTime
Event Time
E