大数据Flink(一百一十六):Flink SQL的时间属性

文章目录

Flink SQL的时间属性

一、Flink 三种时间属性简介

二、Flink 三种时间属性的应用场景

三、​​​​​​​SQL 指定时间属性的两种方式

四、​​​​​​​​​​​​​​SQL 处理时间DDL定义

五、​​​​​​​​​​​​​​SQL 事件时间DDL定义


Flink SQL的时间属性

先看一下本文整体的思路:

  • 与离线处理中常见的时间分区字段一样,在实时处理中,时间属性也是一个核心概念。Flink 支持 处理时间、事件时间摄入时间 三种时间语义。
  • 分别介绍三种时间语义的应用场景及案例。三种时间在生产环境的使用频次事件时间(SQL 常用) > 处理时间(SQL 几乎不用,DataStream 少用) > 摄入时间(不用)

 

一、Flink 三种时间属性简介

  • 事件时间:指的是数据本身携带的时间,这个时间是在事件产生时的时间,而且在 Flink SQL 触发计算时,也使用数据本身携带的时间。这就叫做 事件时间。目前生产环境中用的最多
  • 处理时间:指的是具体算子计算数据执行时的机器时间(例如在算子中 Java 取 System.currentTimeMillis()) ),在生产环境中用的次多
  • 摄入时间:指的是数据从数据源进入 Flink 的时间。摄入时间用的最少,可以说基本不使用

要注意到:

  • 上述的三种时间概念不是由于有了数据而诞生的,而是有了 Flink 之后根据实际的应用场景而诞生的。以事件时间举个例子,如果只是数据携带了时间,Flink 也消费了这个数据,但是在 Flink 中没有使用数据的这个时间作为计算的触发条件,也不能把这个 Flink 任务叫做事件时间的任务。
  • 其次,要认识到,一般一个 Flink 任务只会有一个时间属性,所以时间属性通常认为是一个任务粒度的。举例:我们可以说 A 任务是事件时间语义的任务,B 任务是处理时间语义的任务。当然了,一个任务也可以存在多个时间属性。

二、Flink 三种时间属性的应用场景

以上三种时间属性到底对我们的任务有啥影响呢?三种时间属性的应用场景是啥?

先说结论,在 Flink 中时间的作用:

  • 主要体现在包含时间窗口的计算中:用于标识任务的时间进度,来判断是否需要触发窗口的计算。比如常用的滚动窗口滑动窗口等都需要时间推动触发。这些窗口的应用场景后续会详细介绍。
  • 次要体现在自定义时间语义的计算中:举个例子,比如用户可以自定义每隔 10s 的本地时间,或者消费到的数据的时间戳每增大 10s,就把计算结果输出一次,时间在此类应用中也是一种标识任务进度的作用。

以 滚动窗口 的聚合任务为例来介绍一下事件时间和处理时间的对比区别。

  • 事件时间案例:还是以之前的 clicks 表拿来举例。

上面这个案例的窗口大小是 1 小时,需求方需要按照用户点击时间戳 cTime 划分数据(划分滚动窗口),然后计算出 count 聚合结果(这样计算能反映出事件的真实发生时间),那么就需要把 cTime 设置为窗口的划分时间戳,即代码中 tumble(cTime, interval '1' hour)

上面这种就叫做事件时间。即用数据中自带的时间戳进行窗口的划分(点击操作真实的发生时间)

后续 Flink SQL 任务在运行的过程中也会实际按照 cTime 的当前时间作为一小时窗口结束触发条件并计算一个小时窗口内的数据。

  • 处理时间案例:还是以之前的 clicks 表拿来举例。

还是上面那个案例,但是这次需求方不需要按照数据上的时间戳划分数据(划分滚动窗口),只需要数据来了之后, 在 Flink 机器上的时间作为一小时窗口结束的触发条件并计算。

那么这种触发机制就是处理时间。

  • 摄入时间案例:在 Flink 从外部数据源读取到数据时,给这条数据带上的当前数据源算子的本地时间戳。下游可以用这个时间戳进行窗口聚合,不过这种几乎不使用

 

三、​​​​​​​​​​​​​​SQL 指定时间属性的两种方式

如果要满足 Flink SQL 时间窗口类的聚合操作,SQL 或 Table API 中的 数据源表 就需要提供时间属性(相当于我们把这个时间属性在 数据源表 上面进行声明),以及支持时间相关的操作。

那么来看看 Flink SQL 为我们提供的两种指定时间戳的方式:

  • CREATE TABLE DDL 创建表的时候指定(推荐
  • 可以在 DataStream 中指定,在后续的 DataStream 转的 Table 中使用(略过,授课以Flink SQL为主

一旦时间属性定义好,它就可以像普通列一样使用,也可以在时间相关的操作中使用。

 

四、​​​​​​​​​​​​​​SQL 处理时间DDL定义

处理时间语义下,使用当前机器的系统时间作为处理时间。它是时间的最简单概念。它既不需要提取时间戳,也不需要生成watermark

来看看 Flink SQL 中如何指定处理时间。

  • CREATE TABLE DDL 指定时间戳的方式。
CREATE TABLE user_actions (user_name STRING,data STRING,-- 使用下面这句来将 user_action_time 声明为处理时间user_action_time AS PROCTIME()
) WITH (...
);
  • 使用案例

点击Flink开发平台左侧资源管理,点击上传资源,将资料中的order.csv文件进行上传。

可以点击复制按钮复制其在oss的路径。

可以在oss对应路径看到此文件

读取order.csv'文件的数据,在原本的Schema上添加一个虚拟的时间戳列,时间戳列由PROCTIME()函数计算产生。建表语句如下(path后面路径需要修改) 

 create table proctime_ddl_table (
`userid` varchar,
`timestamp` bigint,
`money` double,
`category` varchar,
`pt` AS PROCTIME()
) with (
'connector' = 'filesystem',
'path' = 'oss://lanson-bucket/artifacts/namespaces/lanson-workspace-default/order.csv',
'format' = 'csv'
);

查询表数据(调试) 

select * from proctime_ddl_table;

查询结果如下

点击左侧导航栏元数据管理,查看表信息。 

五、​​​​​​​​​​​​​​SQL 事件时间DDL定义

来看看 Flink 中如何指定事件时间。

Event Time时间语义使用一条数据实际发生的时间作为时间属性,在Table API & SQL中这个字段通常被称为rowtime。这种模式下多次重复计算时,计算结果是确定的。这意味着,Event Time时间语义可以保证流处理和批处理的统一

Event Time时间语义下,我们需要设置每条数据发生时的时间戳,并提供一个Watermark。Watermark表示迟于该时间的数据都作为迟到数据对待

  • CREATE TABLE DDL 指定时间戳的方式。
CREATE TABLE user_actions (user_name STRING,data STRING,user_action_time TIMESTAMP(3),-- 使用下面这句来将 user_action_time 声明为事件时间,并且声明 watermark 的生成规则,即 user_action_time 减 5 秒-- 事件时间列的字段类型必须是 TIMESTAMP 或者 TIMESTAMP_LTZ 类型WATERMARK FOR user_action_time AS user_action_time - INTERVAL '5' SECOND
) WITH (...
);

在上面的DDL中,WATERMARK起到了定义Event Time时间属性的作用,在这里暂时不讲解,watermark知识点后续会讲到

如果想使用事件时间,那么我们的时间戳类型必须是 TIMESTAMP 或者 TIMESTAMP_LTZ 类型。

但是实际应用中时间戳一般都是秒或者是毫秒(BIGINT 类型),那这种情况怎么办?

解决方案如下

CREATE TABLE user_actions (user_name STRING,data STRING,-- 1. 这个 ts 就是常见的毫秒级别时间戳ts BIGINT,-- 2. 将毫秒时间戳转换成 TIMESTAMP_LTZ 类型time_ltz AS TO_TIMESTAMP_LTZ(ts, 3),-- 3. 使用下面这句来将 time_ltz 声明为事件时间,并且声明 watermark 的生成规则,即 time_ltz 减 5 秒-- 事件时间列的字段类型必须是 TIMESTAMP 或者 TIMESTAMP_LTZ 类型WATERMARK FOR time_ltz AS time_ltz - INTERVAL '5' SECOND
) WITH (...
);
  • 使用案例

读取order.csv'文件的数据,定义现有事件时间字段上的 watermark 生成表达式,该表达式将事件时间字段标记为事件时间属性

建表语句如下

create table eventime_ddl_table (
`userid` varchar,
`timestamp` bigint,
`money` double,
`category` varchar,
rt AS TO_TIMESTAMP(FROM_UNIXTIME(`timestamp`)),
watermark for rt as rt - interval '1' second
) with (
'connector' = 'filesystem',
'path' = 'oss://bucketnanfeng/artifacts/namespaces/lanson-flinkworkspace1-default/order.csv',
'format' = 'csv'
);

查询表数据(调试)

select * from eventime_ddl_table;

查询结果如下

点击左侧导航栏元数据管理,查看表信息。 

 


  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/421012.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解Java虚拟机:Jvm总结-垃圾收集器与内存分配策略

第三章 垃圾收集器与内存分配策略 3.1 意义 Java堆和方法区具有不确定性:一个接口的多个实现类、一个方法的不同条件分支需要的内存可能不一样。程序运行起来才知道到底会创建什么对象,创建多少个对象。动态分配内存和垃圾回收排查内存泄漏和内存溢出时…

javascript柯里化

return a b c d; } //通常调用方式 var sum add(1, 2, 3, 4); //柯里化的调用方式 var curryAdd Curry(add); var sum curryAdd(1)(2)(3)(4); //或者很多奇怪的方式调用 var sum curryAdd(1, 2)(3, 4); var sum curryAdd(1, 2, 3)(4); var sum curryAdd(1)(…

5.第二阶段x86游戏实战2-认识内存

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

24/9/6算法笔记 kaggle 房屋价格

预测模型主要分为两大类: 回归模型:当你的目标变量是连续的数值时,你会使用回归模型进行预测。回归模型试图找到输入特征和连续输出之间的关联。一些常见的回归模型包括: 线性回归(Linear Regression)岭回归…

FFmpeg 7.0 版本 “Dijkstra”的特点概述

FFmpeg 7.0 FFmpeg 官网:https://ffmpeg.org/FFmpeg 官网更新日志,2024.4.5 号发布代号"Dijkstra"的 7.0 版本的 FFmpeg,如下截图: 为什么叫 Dijkstra“Dijkstra” 指的是艾兹格戴克斯特拉(Edsger Wybe Dijkstra),他是一位荷兰计算机科学家,对计算机科学领域…

C#使用TCP-S7协议读写西门子PLC(一)

之前本人发布西门子S7协议的报文 西门子PLC的S7协议报文解析说明_西门子报文详解-CSDN博客 西门子PLC的S7协议是西门子公司在ModbusTcp协议的基础上自定义的一种协议,仅支持西门子PLC,S7协议本质仍然属于TCP协议的一种自定义具体实现 第一步,准备工作。VS2022中新建窗体应…

Redis学习Day3——项目工程开发

扩展阅读推荐: 黑马程序员Redis入门到实战教程_哔哩哔哩_bilibili 一、项目介绍及其初始化 学习Redis的过程,我们还将遇到各种实际问题,例如缓存击穿、雪崩、热Key等问题,只有在实际的项目实践中解决这些问题,才能更好…

教师节特辑:AI绘制的卡通人物,致敬最可爱的人‍

【编号:9】教师节到了,今天我要分享一组由AI绘制的教师节主题卡通人物插画,每一幅都充满了对老师的敬意和爱戴。让我们一起用这些可爱的卡通形象,向辛勤的园丁们致敬! 🎓【教师形象】 这…

域名证书,泛域名证书,sni

文章目录 前言一、证书1.全域名证书2.泛域名证书 二、域名证书的使用1、浏览器请求域名证书流程对全域名证书的请求流程对泛域名证书的请求流程ssl client-hello携带server name 报文 2、浏览器对证书的验证流程 三、域名证书和sni 前言 本文介绍了泛域名证书和全域名证书的区别…

JavaWeb【day12】--(SpringBootWeb登录认证)

案例-登录认证 在前面的课程中,我们已经实现了部门管理、员工管理的基本功能,但是大家会发现,我们并没有登录,就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的,所以我们今天的主题就是登录认证。 最终我们…

【32单片机篇】项目:智能台灯

一、项目需求 1. 红外传感器检测是否有人,有人的话实时检测距离,过近则报警;同时计时,超过固定时间则报警; 2. 按键 1 切换工作模式:智能模式、按键模式、远程模式; 3. 智能模式下,…

UML之类图详解

犬余🐶 “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 零、什么是类图 类图(Class Diagram)是面向对象系统建模中最常用和最重要的图,它通过图形化的方式展示系统中的…

Conda安装R环境并在Jupyter Lab中运行

说明: Conda 安装 R 环境,并在 Jupyter Lab 中运行 R 脚本。 1. 创建环境并安装r-base 创建环境:conda create -n [环境名] 激活环境:conda activate [环境名] 安装 Jupyter Lab:conda install -c conda-forge jupy…

Promise详解、自定义

这里写目录标题 一、.Promise对象详解1. Promise是什么2. Promise的优点3. 异步编程4. then(onFulfilled, onRejected):5. util.promisify 方法:6. promise的状态改变7.Promise 对象的值8. Promise的基本执行流程9. Promise的API10. Promise中的关键问题…

怎么修复松下相机死机视频只有0字节(0KB)的MDT文件【实测可修复】

死机后视频文件大小仅为0字节 松下S5相机录像死机,关机重新开机后有一个视频文件变成MDT,大小为0KB,录了30多分钟,本应为MOV格式的视频。0字节文件可以修复吗?怎么修复0字节的MDT文件为视频? 数据提取与视…

四款免费视频剪辑工具使用感受与优劣势总结

在如今这个视频内容如火如荼的时代,如何快速高效地完成视频剪辑成为许多人关心的问题;今天,我们就来轻松愉快地聊一聊本人常用的四款免费的视频剪辑工具;这四款工具各有千秋,让我们一起来看看它们的使用感受和优劣势吧…

数据结构(并查集) How did you do it? 怎么做到的!!!

一、前言 并查集的历史 1964年, Bernard A. Galler 和 Michael J. Fischer 首次描述了不相交的并查集,1975 年,Robert Tarjan 是第一个证明O(ma(n))(逆阿克曼函数 (opens new window))算法时间复杂度的上限&#xff…

C语言深入了解指针一(14)

文章目录 前言一、内存和地址内存究竟该如何理解编址 二、指针变量和地址取地址操作符&解引用操作符*指针变量的大小 总结 前言 终于来到指针啦!如前篇末尾总结所说,这是你们马上要下大功夫的地方   但是,就像我们上初中的时候&#xf…

【开发工具】IntelliJ IDEA插件推荐:Json Helper——让JSON处理更高效

导语:在Java开发过程中,JSON作为一种轻量级的数据交换格式,被广泛应用于前后端数据交互。今天,我要为大家介绍一款IntelliJ IDEA插件——Json Helper,帮助开发者更高效地处理JSON数据。 一、什么是Json Helper&#x…

智能优化算法-樽海鞘优化算法(SSA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 樽海鞘优化算法 (Salp Swarm Algorithm, SSA) 虽然名称中提到的是“樽海鞘”,但实际上这个算法是基于群体智能的一种元启发式优化算法,它模拟了樽海鞘(Salps)在海…