flink 双流join的简单demo验证(mysql --> print)_flink 双流join写入mysqldemo

import static org.apache.flink.table.api.Expressions.$;

/**
* @author 划水小苏
* @date 2024/02/16 19:30
* @target:
**/
public class TestDemo02 {
public static void main(String[] args) {
//1.使用本地模式
Configuration conf = new Configuration();
//设置WebUI绑定的本地端口
conf.setString(RestOptions.BIND_PORT,“8081”);
// https://nightlies.apache.org/flink/flink-docs-release-1.13/zh/docs/dev/table/config/
// 并行度设置
conf.setString(“table.exec.resource.default-parallelism”,“1”);
// pipeline.operator-chaining 拆分算子
conf.setString(“pipeline.operator-chaining”,“false”);
EnvironmentSettings settings = EnvironmentSettings
.newInstance()
.inStreamingMode()
.withConfiguration(conf)
.build();
TableEnvironment tabelEnv = TableEnvironment.create(settings);

tabelEnv.executeSql(“CREATE TABLE test01 (\n” +
" a1 VARCHAR(25) ,\n" +
" a2 VARCHAR(25) NOT NULL,\n" +
" PRIMARY KEY (a2) NOT ENFORCED \n" +
“) WITH (\n” +
“‘connector’ = ‘mysql-cdc’, \n”+
“‘database-name’ = ‘sk_db_test01’, \n”+
“‘hostname’ = ‘127.0.0.1’, \n”+
“‘password’ = ‘12345678’, \n”+
“‘port’ = ‘3306’, \n”+
“‘table-name’ = ‘test01’, \n”+
“‘username’ = ‘root’, \n”+
“‘scan.startup.mode’ = ‘latest-offset’ \n”+
“)”);

tabelEnv.executeSql(“CREATE TABLE test02 (\n” +
" b1 VARCHAR(25) ,\n" +
" b2 VARCHAR(25) NOT NULL,\n" +
" PRIMARY KEY (b2) NOT ENFORCED \n" +
“) WITH (\n” +
“‘connector’ = ‘mysql-cdc’, \n”+
“‘database-name’ = ‘sk_db_test01’, \n”+
“‘hostname’ = ‘127.0.0.1’, \n”+
“‘password’ = ‘12345678’, \n”+
“‘port’ = ‘3306’, \n”+
“‘table-name’ = ‘test02’, \n”+
“‘username’ = ‘root’, \n”+
“‘scan.startup.mode’ = ‘latest-offset’ \n”+
“)”);

tabelEnv.executeSql(“CREATE TABLE PrintSink (\n” +
" c1 VARCHAR(25), \n" +
" c2 VARCHAR(25), \n" +
" c3 VARCHAR(25) \n" +
“) WITH (\n” +
" ‘connector’ = ‘print’ \n" +
“)”);
tabelEnv.executeSql(“INSERT INTO PrintSink\n” +
“SELECT a.*,b.b1 FROM test01 AS a\n” +
“RIGHT join test02 AS b\n” +
“ON a.a2 = b.b2\n” +
“;”);
}
}

pom 文件 (新增mysql connector依赖)

完整版看Flink table api那个pom哈,新增即可

org.apache.flink flink-connector-base ${flink.version} com.ververica flink-connector-mysql-cdc 2.3.0
mysql侧sql

– 建表
DROP TABLE IF EXISTS test01 ;
CREATE TABLE test01 (
a1 VARCHAR(25),
a2 VARCHAR(25) NOT NULL,
PRIMARY KEY (a2)
);

DROP TABLE IF EXISTS test02 ;
CREATE TABLE test02 (
b1 VARCHAR(25),
b2 VARCHAR(25) NOT NULL,
PRIMARY KEY (b2)
);

– 数据插入与更新
INSERT INTO test01 values(“左1”,“sk01”);
SELECT * FROM test01 ;
UPDATE test01 set a1 = “左2” where a2 = “sk01”;

INSERT INTO test01 values(“左1”,“sk02”);

INSERT INTO test02 values(“右1”,“sk01”);
SELECT * FROM test02 ;
UPDATE test02 set b1 = “右2” where b2 = “sk01”;

right join
简单概述

首先进行一个简单的排列组合一下,左流数据有或无,右流数据有或无,展开即为
(有,无) | (有,有) | (无,无) | (无,有)
第三种不在简述里面存在,那就丢掉这种可能,只讨论剩下的三种情况

– 右流来了数据,左流没这种数据怎么办?
+I[null,b]
– 那后面左流来了这条数据呢?
-D[null,b]
+I[a,b]
– 存在一个疑问点就是这个右流的数据是什么情况,为什么还有-D这种?
未关联到数据,不会立即丢弃掉,而是存在记忆里面,但是记忆存多久呢?State的ttl就是记忆时间
在记忆时间里面,左流数据到达后,会重新下发数据,也就常说的回撤。
关于-D操作是因为在实时计算里面,这种动态表概念,详情可以看官网详解哈,这里通过白话来理解哈,
在整体的流计算数据里面,由于存在一些记忆,
让flink理解到之前的数据是脏数据,需要使用-D来把之前的+I数据抵消掉,从而下发一条新的数据
但,至于sink端如何处理这些数据,是依次+I还是进行+U是由sink端处理的,flink侧只负责下发这种逻辑

– 右流来了数据,关联到左流的数据会下发什么?
+I[a,b]
– 如果左流不断更新,数据会下发什么?
+I[a1,b]
-D[a1,b]
+I[a2,b]
在记忆时间里面,会一直维护条数据,会出现不断更新
– 如果左流来了数据,但是右流没数据关联,数据下发会是什么样子呢

示例:

基于阿里云实现结果的截图,上面的demo控制台也是可以一样输出的,强烈推荐阿里云Flink产品,我觉得很nice,最起码写sql很得劲,我是一个快乐的sql boy。
在这里插入图片描述

1、新增右流数据

INSERT INTO test02 values(“右1”,“sk01”);

在这里插入图片描述

2、新增左流数据

INSERT INTO test02 values(“右1”,“sk01”);

在这里插入图片描述

3、更新左流数据

UPDATE test01 set a1 = “左2” where a2 = “sk01”;

在这里插入图片描述

4、更新右流数据

UPDATE test02 set b1 = “右2” where b2 = “sk01”;

在这里插入图片描述

left join
简单概述

基于上续Java代码只修改right 为 left 即可

在这里插入图片描述

简单概述现象
左不等右等 左2右4

示例

1、先来左流数据 ( INSERT INTO test01 values(“左1”,“sk01”); )

+I [左1, sk01, null]

在这里插入图片描述
2、先来右流数据( INSERT INTO test02 values(“右1”,“sk01”); )

无数据输出 (相当于首次执行哈,要和上面的顺序执行做区分)

3、join之后的情况

+I [左1, sk01, 右1]

image-20240302154752750
4、更新左流数据 ( UPDATE test01 set a1 = “左2” where a2 = “sk01”; )

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
img

g6k5Rkn-1712517093386)]
[外链图片转存中…(img-VEVMxRo3-1712517093387)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-OlxqEIrK-1712517093387)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值