基于FlinkSQL流式处理的练习(Temporal Table的使用)

Flink的表API是一种类似SQL的表达式语言,用于关系流和批处理,可以嵌入Flink的Java和Scala数据集和数据流API中。表API和SQL接口在关系表抽象上运行,可以从外部数据源或现有数据流和数据集创建表。表API支持关系运算符,如表上的选择、聚合和连接等。

也可以使用常规SQL查询表。表API提供了和SQL相同的功能,可以在同一程序中混合使用。将表转换回数据集或数据流时,由关系运算符和SQL查询定义的逻辑计划将使用Apache Calcite进行优化,并转换为数据集或数据流程序

 

使用flinksql完成流式处理任务,具体需求如下。
需求描述:   
1)自定义kafka主题,使用flink从kafka中读取原油实时售价数据,注册成表;
数据如下
油品种类       价格        时间
LightCrudeOil    100    2020/11/25 09:00:00
MediumCrudeOil    90    2020/11/25 09:00:00
HeavyCrudeOil    78    2020/11/25 09:00:00
MediumCrudeOil    88    2020/11/25 10:45:00
MediumCrudeOil    89    2020/11/25 11:15:00
HeavyCrudeOil    76    2020/11/25 11:49:00
2)自定义kafka主题,从kafka中读取购买原油订单数据,注册成表;
油品种类     购买数量     时间
MediumCrudeOil    2    2020/11/25 10:15:00
LightCrudeOil    1    2020/11/25 10:30:00
HeavyCrudeOil    5    2020/11/25 10:32:00
MediumCrudeOil    3    2020/11/25 10:52:00
LightCrudeOil    6    2020/11/25 11:04:00
3)将kafka偏移量保存在checkpoint中,使用精确一次消费模式;
4)使用将原油实时售价数据注册成Temporal Table的方式进行计算 ;
5)现在要根据订单下单的时间和实时的单价表使用flinksql实时计算出订单的金额,字段包含油品种类、购买数量、订单金额、购买时间;
(例如10点52分的MediumCrudeOil原油价格要遵从10点45分时的价格而不是9点的价格)
6)使用flinksql实时计算MediumCrudeOil下单次数及其总订单金额&#x

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章 整体介绍 2 1.1 什么是 Table API 和 Flink SQL 2 1.2 需要引入的依赖 2 1.3 两种 planner(old & blink)的区别 4 第二章 API 调用 5 2.1 基本程序结构 5 2.2 创建表环境 5 2.3 在 Catalog 中注册表 7 2.3.1 表(Table)的概念 7 2.3.2 连接到文件系统(Csv 格式) 7 2.3.3 连接到 Kafka 8 2.4 表的查询 9 2.4.1 Table API 的调用 9 2.4.2 SQL 查询 10 2.5 将 DataStream 转换成表 11 2.5.1 代码表达 11 2.5.2 数据类型与 Table schema 的对应 12 2.6. 创建临时视图(Temporary View) 12 2.7. 输出表 14 2.7.1 输出到文件 14 2.7.2 更新模式(Update Mode) 15 2.7.3 输出到 Kafka 16 2.7.4 输出到 ElasticSearch 16 2.7.5 输出到 MySql 17 2.8 将表转换成 DataStream 18 2.9 Query 的解释和执行 20 1. 优化查询计划 20 2. 解释成 DataStream 或者 DataSet 程序 20 第三章 流处理中的特殊概念 20 3.1 流处理和关系代数(表,及 SQL)的区别 21 3.2 动态表(Dynamic Tables) 21 3.3 流式持续查询的过程 21 3.3.1 将流转换成表(Table) 22 3.3.2 持续查询(Continuous Query) 23 3.3.3 将动态表转换成流 23 3.4 时间特性 25 3.4.1 处理时间(Processing Time) 25 3.4.2 事件时间(Event Time) 27 第四章 窗口(Windows) 30 4.1 分组窗口(Group Windows) 30 4.1.1 滚动窗口 31 4.1.2 滑动窗口 32 4.1.3 会话窗口 32 4.2 Over Windows 33 1) 无界的 over window 33 2) 有界的 over window 34 4.3 SQL 中窗口的定义 34 4.3.1 Group Windows 34 4.3.2 Over Windows 35 4.4 代码练习(以分组滚动窗口为例) 36 第五章 函数(Functions) 38 5.1 系统内置函数 38 5.2 UDF 40 5.2.1 注册用户自定义函数 UDF 40 5.2.2 标量函数(Scalar Functions) 40 5.2.3 表函数(Table Functions) 42 5.2.4 聚合函数(Aggregate Functions) 45 5.2.5 表聚合函数(Table Aggregate Functions) 47
要触发Flink的event time temporal join,需要满足以下条件: 1. 数据源必须有时间戳(timestamp)字段,用于标识事件发生的时间。 2. 数据源必须定义Event Time和Watermark,用于处理乱序事件数据。 3. 执行join操作时,需要使用Window函数将事件流分割为固定时间段的窗口,以便进行join操作。 4. 在join操作中,需要将窗口中的数据按照时间戳进行排序。 5. 确保所有数据源都使用相同的时间语义(Event Time)。 以下是一个示例代码,演示如何触发Flink的event time temporal join: ``` DataStream<Order> orders = env .addSource(new OrderSource()) .assignTimestampsAndWatermarks(new OrderTimestampExtractor()); DataStream<Payment> payments = env .addSource(new PaymentSource()) .assignTimestampsAndWatermarks(new PaymentTimestampExtractor()); orders.join(payments) .where(order -> order.getCustomerId()) .equalTo(payment -> payment.getCustomerId()) .window(TumblingEventTimeWindows.of(Time.seconds(10))) .apply(new JoinFunction<Order, Payment, String>() { @Override public String join(Order order, Payment payment) throws Exception { return "Order: " + order.toString() + ", Payment: " + payment.toString(); } }) .print(); ``` 在上述代码中,orders和payments分别是两个数据源,分别代表订单和支付信息。我们使用OrderTimestampExtractor和PaymentTimestampExtractor对它们进行时间戳和Watermark的处理。 在join操作中,我们使用where和equalTo指定订单和支付信息的关联字段,使用TumblingEventTimeWindows将事件流分割为10秒的窗口,然后使用JoinFunction进行join操作,并将结果打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值