flink 学习笔记

每次先大致写下,后期写的多了在去调格式

目录

每次先大致写下,后期写的多了在去调格式

目录

每次先大致写下,后期写的多了在去调格式

一、文档学习

flink 中时间语义:

waterMark 水位线:

二、官网学习

1、列属性中:计算列 Computed Columns :

Event time 的介绍:

Process time 的介绍:

 2、测试实时代码时,可以先不写入到表中,先标准输出到界面中。

 3、upsert kafka 



一、文档学习

flink 中时间语义:

①、Event Time:是事件创建的时间。例如采集的日志数据中,每一条日志都会记录自己的生成时间

②、Ingestion Time:是数据进入Flink的时间。(ingestion 摄取进入)。

③、Processing Time(算子执行时的时间):是每一个执行基于时间操作算子的本地系统时间,与机器相关,默认的时间属性就是Processing Time。

waterMark 水位线:

waterMark 特点: waterMark 是一种衡量 Event time进展的机制,所以 waterMark 必须是单调递增的。

waterMark = n 表示什么? 表示 在 n s 之前的数据已经全部到达了。

waterMark 是什么? waterMark 是 一个特殊的数据,并作为一个特殊的数据 插入到数据流中

waterMark 作用: waterMark 是用来处理乱序数据的,有乱序数据时,才会使用(正常顺序的,采用事件事件即可,因为正常顺序已经表示在 n s 之前的数据已经到达。)

举例: 

        比如设置的 waterMark 允许乱序时间(最大延迟到达时间)为 2s,则 waterMark = 事件时间  - 2s


 

二、官网学习

基于 flink 1.12

1、列属性中:计算列 Computed Columns :

计算列: 可以理解为 通过计算产生的一列。

flink 学习笔记_第1张图片

解释: 文中说计算列 一般用来定义时间属性。 

Event time 的介绍:

flink 学习笔记_第2张图片

解释: 文中说的是 事件时间 是可以基于每条记录的时间戳(topic 中最后一列有这个字段)。

        一般来说  WaterMark 是基于事件时间来产生的。

CREATE TABLE user_actions (
  user_name STRING,
  data STRING,
  user_action_time TIMESTAMP(3),
  -- declare user_action_time as event time attribute and use 5 seconds delayed watermark strategy
  WATERMARK FOR user_action_time AS user_action_time - INTERVAL '5' SECOND
) WITH (
  ...
);

SELECT TUMBLE_START(user_action_time, INTERVAL '10' MINUTE), COUNT(DISTINCT user_name)
FROM user_actions
GROUP BY TUMBLE(user_action_time, INTERVAL '10' MINUTE);

TIMESTAMP(3) 这个是什么意思? 也是一个函数?

Process time 的介绍:

flink 学习笔记_第3张图片

CREATE TABLE user_actions (
  user_name STRING,
  data STRING,
  user_action_time AS PROCTIME() -- declare an additional field as a processing time attribute
) WITH (
  ...
);

SELECT TUMBLE_START(user_action_time, INTERVAL '10' MINUTE), COUNT(DISTINCT user_name)
FROM user_actions
GROUP BY TUMBLE(user_action_time, INTERVAL '10' MINUTE);

解释: 

         PROCTIME()  是一个函数。 使用 ** AS  PROCTIME()   这样的格式就是把某某字段作为一个处理时间列。然后使用时,滚动窗口中使用的时间列就是 ** 所对应的时间列。(user_action_time 是随意定义的一个列,以便后面使用。 )

2、测试实时代码时,可以先不写入到表中,先标准输出到界面中。

注意:

        主要用于调试。

Apache Flink 1.12 Documentation: Print SQL 连接器

flink 学习笔记_第4张图片

flink 学习笔记_第5张图片

CREATE TABLE print_table (
 f0 INT,
 f1 INT,
 f2 STRING,
 f3 DOUBLE
) WITH (
 'connector' = 'print'
)

flink 学习笔记_第6张图片

 flink 学习笔记_第7张图片

查看 print 输出的数据:

 

 3、upsert kafka 

主要是为了保证数据一致性。

Apache Flink 1.12 Documentation: Upsert Kafka SQL 连接器

flink 学习笔记_第8张图片

CREATE TABLE pageviews_per_region (
  user_region STRING,
  pv BIGINT,
  uv BIGINT,
  PRIMARY KEY (user_region) NOT ENFORCED
) WITH (
  'connector' = 'upsert-kafka',
  'topic' = 'pageviews_per_region',
  'properties.bootstrap.servers' = '...',
  'key.format' = 'avro',
  'value.format' = 'avro'
);

CREATE TABLE pageviews (
  user_id BIGINT,
  page_id BIGINT,
  viewtime TIMESTAMP,
  user_region STRING,
  WATERMARK FOR viewtime AS viewtime - INTERVAL '2' SECOND
) WITH (
  'connector' = 'kafka',
  'topic' = 'pageviews',
  'properties.bootstrap.servers' = '...',
  'format' = 'json'
);

-- 计算 pv、uv 并插入到 upsert-kafka sink
INSERT INTO pageviews_per_region
SELECT
  user_region,
  COUNT(*),
  COUNT(DISTINCT user_id)
FROM pageviews
GROUP BY user_region;

flink 学习笔记_第9张图片

 flink 学习笔记_第10张图片

你可能感兴趣的:(flinkSql,flink,学习)