FLINK笔记

几个常用的和基本的数据库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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值