Flink 双流Join基本原理-普通双流Join
This commit is contained in:
parent
36a1b4d97c
commit
34c369c3cf
6
Flink_SQL/README.md
Normal file
6
Flink_SQL/README.md
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
<a title="Hits" target="_blank" href="https://github.com/zeekling/hits"><img src="https://hits.b3log.org/zeekling/flink_book.svg"></a></p>
|
||||
|
||||
- [双流Join底层原理](./双流Join底层原理.md)
|
||||
|
||||
|
BIN
Flink_SQL/flinksql_0001.png
Normal file
BIN
Flink_SQL/flinksql_0001.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 142 KiB |
154
Flink_SQL/双流Join底层原理.md
Normal file
154
Flink_SQL/双流Join底层原理.md
Normal file
@ -0,0 +1,154 @@
|
||||
|
||||
<a title="Hits" target="_blank" href="https://github.com/zeekling/hits"><img src="https://hits.b3log.org/zeekling/flink_book.svg"></a></p>
|
||||
|
||||
# 底层原理简介
|
||||
|
||||
![pic](./flinksql_0001.png)
|
||||
|
||||
- LState:存储左边数据流中的数据。
|
||||
- RState:存储右边数据流中的数据。
|
||||
- 当左边数据流数据到达的时候会保存到LState,并且到RState中进行Join。将Join生成的结果数据发送到下游。
|
||||
- 右边数据流中数据到达的时候,会保存到RState当中,并且到LState中进行Join,然后将Join之嚄胡的结果数据发送到下游。
|
||||
|
||||
|
||||
为了保障左右两边流中需要Join的数据出现在相同节点,Flink SQL会利用Join中的on的关联条件进行分区,把相同关联条件
|
||||
的数据分发到同一个分区里面。
|
||||
|
||||
|
||||
|
||||
# 普通双流Join
|
||||
|
||||
现有订单表A和支付表B进行关联得到汇总表C。订单表和支付表初始数据如下:
|
||||
|
||||
表A:订单表数据
|
||||
| order_id | timestamp|
|
||||
|---|--|
|
||||
| 1001 | 2023-02-04 10:00:00 |
|
||||
| 1002 | 2023-01-04 10:01:02 |
|
||||
|
||||
表B:支付表数据
|
||||
|
||||
| order_id | pay_money |
|
||||
|---|---|
|
||||
| order_id | pay_money |
|
||||
| 1001 | 80 |
|
||||
| 1002 | 100 |
|
||||
|
||||
## inner join
|
||||
|
||||
当A表中每一条数据到达时,都会和B表中的数据进行关联:
|
||||
- 当能够关联到数据时,将结果输出到结果表里面;
|
||||
- 当不能关联到数据时,不会将结果输出到结果表里面;
|
||||
|
||||
所以上述A表和B表的Join结果为:
|
||||
|
||||
| order_id | timestamp | pay_money |
|
||||
|--- |--- |--- |
|
||||
| 1002 | 2023-01-04 10:01:02 | 100 |
|
||||
|
||||
当表B中1001新数据到达时,新数据如下所示:
|
||||
|
||||
| order_id | pay_money |
|
||||
|---|---|
|
||||
| order_id | pay_money |
|
||||
| 1001 | 80 |
|
||||
|
||||
此时结果表的数据为:
|
||||
|
||||
| order_id | timestamp | pay_money |
|
||||
|--- |--- |--- |
|
||||
| 1002 | 2023-01-04 10:01:02 | 100 |
|
||||
| 1001 | 2023-02-04 10:00:00 | 80 |
|
||||
|
||||
***注意***
|
||||
|
||||
Inner Join 不会产生回撤流。
|
||||
|
||||
## left join
|
||||
|
||||
当A表数据到达时会主动和B表中数据进行关联查询,没有关联到数据。也会输出结果,缺失的字段使用null进行补全。
|
||||
|
||||
B表中的数据1002到达之后且A表中的数据1001和1002已经到达,关联之后表C的数据如下:
|
||||
|
||||
| order_id | timestamp | pay_money |
|
||||
|--- |--- |--- |
|
||||
| 1001 | 2023-02-04 10:00:00 | null |
|
||||
| 1002 | 2023-01-04 10:01:02 | 100 |
|
||||
|
||||
当B表中数据1001到达之后,也会主动和表A中的数据进行关联,如果表中的数据已经输出过结果了且缺失字段为null,此时
|
||||
会产生一个回撤流,将之前输出的数据会撤掉-D,在重新输出完整的数据+I。
|
||||
|
||||
|
||||
| order_id | timestamp | pay_money | / |
|
||||
|--- |--- |--- |---|
|
||||
| 1001 | 2023-02-04 10:00:00 | null | +I|
|
||||
| 1002 | 2023-01-04 10:01:02 | 100 | +I |
|
||||
| 1001 | 2023-02-04 10:00:00 | null | -D |
|
||||
| 1001 | 2023-02-04 10:00:00 | 80 | +I |
|
||||
|
||||
***注意***
|
||||
|
||||
left Join会产生回撤流。
|
||||
|
||||
|
||||
## Right Join
|
||||
|
||||
当表B中1001到达时,A表中的数据没有到达,则还是会输出数据,缺失字段使用null代替。当表B中数据1002到达时,A表中的
|
||||
数据1002已经到达此时可以关联到数据,关联结果如下:
|
||||
|
||||
| order_id | timestamp | pay_money |
|
||||
|--- |--- |--- |
|
||||
| 1001 | null | null |
|
||||
| 1002 | 2023-01-04 10:01:02 | 100 |
|
||||
|
||||
当表A中数据1001到达时,会主动到B表中进行关联,此时结果中已经输出过关于1001的数据,此时会产生一个回撤流。
|
||||
|
||||
| order_id | timestamp | pay_money | / |
|
||||
|--- |--- |--- | ---|
|
||||
| 1001 | null | null | +I|
|
||||
| 1002 | 2023-01-04 10:01:02 | 100 | +I |
|
||||
| 1001 | null | null | -D |
|
||||
| 1001 | 2023-02-04 10:00:00 | 80 | +I |
|
||||
|
||||
***注意***
|
||||
|
||||
Right Join会产生回撤流。
|
||||
|
||||
## Full Join
|
||||
|
||||
当表B中数据1001先到达时,会主动到A表中进行关联查询,关联不到数据,还是会输出结果。
|
||||
|
||||
当表A中数据到达时,会主动和B表中的数据进行关联查询,此时B表中只有1001的数据,灌篮不到数据,还是会输出结果。
|
||||
|
||||
所以此时关联结果如下:
|
||||
|
||||
| order_id | timestamp | pay_money |
|
||||
|--- |--- |--- |
|
||||
| 1001 | null | null |
|
||||
| 1002 | 2023-01-04 10:01:02 | null |
|
||||
|
||||
|
||||
当表A中的1001到达时,会和B表进行关联查询,当表B的1002到达时,会和表A进行关联查询,此时结果如下:
|
||||
|
||||
| order_id | timestamp | pay_money | / |
|
||||
|--- |--- |--- | ---|
|
||||
| 1001 | null | null | +I |
|
||||
| 1002 | 2023-01-04 10:01:02 | null | +I |
|
||||
| 1001 | null | null | -D |
|
||||
| 1001 | 2023-02-04 10:00:00 | 80 | +I |
|
||||
| 1002 | 2023-01-04 10:01:02 | null | -D |
|
||||
| 1002 | 2023-01-04 10:01:02 | 100 | +I |
|
||||
|
||||
***注意***
|
||||
|
||||
Full Join 会产生回撤流。
|
||||
|
||||
# Interval Join
|
||||
|
||||
|
||||
|
||||
|
||||
# 维表Join
|
||||
|
||||
|
||||
|
21
README.md
21
README.md
@ -9,6 +9,8 @@
|
||||
|
||||
# 内存调优
|
||||
|
||||
## 目录
|
||||
|
||||
- [内存等资源调优](./调优/Resource.md)
|
||||
- [状态和CheckPoint 调优](./调优/CheckPoint.md)
|
||||
- [如何分析及处理 Flink 反压](./调优/backpress.md)
|
||||
@ -16,5 +18,24 @@
|
||||
|
||||
# 常见故障排除
|
||||
|
||||
## 目录
|
||||
|
||||
- [常见问题总结](./常见问题)
|
||||
|
||||
|
||||
# Flink SQL
|
||||
|
||||
Flink SQL学习笔记提纲。持续更新。Hive SQL 离线Join VS Flink SQL 双流Join。
|
||||
|
||||
| 对比维度 | Hive SQL离线Join | Flink SQL双流Join |
|
||||
| ---| ----|----|
|
||||
| 数据源 | 有界(离线数据)| 无界(实时数据) |
|
||||
| 计算次数 | 一次 | 持续计算 |
|
||||
| 计算结果 | 有界(离线数据) | 无界(实时数据) |
|
||||
| 计算驱动 | 单边驱动 | 双边驱动 |
|
||||
|
||||
## 目录
|
||||
|
||||
- [Flink SQL双流Join底层原理](./Flink_SQL/双流Join底层原理.md)
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user