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.0mysql侧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
seta1
= “左2” wherea2
= “sk01”;
4、更新右流数据
UPDATE
test02
setb1
= “右2” whereb2
= “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]
4、更新左流数据 ( UPDATE test01
set a1
= “左2” where a2
= “sk01”; )
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
g6k5Rkn-1712517093386)]
[外链图片转存中…(img-VEVMxRo3-1712517093387)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-OlxqEIrK-1712517093387)]