1.序篇
看了那么多的技术文,你能明白作者想让你在读完文章后学到什么吗?
大数据羊说__的文章会让你明白
1. 博主会阐明博主期望本文能给小伙伴们带来什么帮助,让小伙伴萌能直观明白博主的心思
2. 博主会以实际的应用场景和案例入手,不只是知识点的简单堆砌
3. 博主会把重要的知识点的原理进行剖析,让小伙伴萌做到深入浅出
进入正文。
源码公众号后台回复1.13.2 sql join 的奇妙解析之路获取。
下面即是文章目录,也对应到本文的结论,小伙伴可以先看结论快速了解本文能给你带来什么帮助:
-
背景及应用场景介绍:join 作为离线数仓中最常见的场景,在实时数仓中也必然不可能缺少它,flink sql 提供的丰富的 join 方式(总结 6 种:regular join,维表 join,temporal join,interval join,array 拍平,table function 函数)对我们满足需求提供了强大的后盾
-
先来一个实战案例:以一个曝光日志 left join 点击日志为案例展开,介绍 flink sql join 的解决方案
-
flink sql join 的解决方案以及存在问题的介绍:主要介绍 regular join 的在上述案例的运行结果及分析源码机制,它虽然简单,但是 left join,right join,full join 会存在着 retract 的问题,所以在使用前,你应该充分了解其运行机制,避免出现数据发重,发多的问题。
-
本文主要介绍 regular join retract 的问题,下节介绍怎么使用 interval join 来避免这种 retract 问题,并满足第 2 点的实战案例需求。
2.背景及应用场景介绍
在我们的日常场景中,应用最广的一种操作必然有 join 的一席之地,例如
-
计算曝光数据和点击数据的 CTR,需要通过唯一 id 进行 join 关联
-
事实数据关联维度数据获取维度,进而计算维度指标
上述场景,在离线数仓应用之广就不多说了。
那么,实时流之间的关联要怎么操作呢?
flink sql 为我们提供了四种强大的关联方式,帮助我们在流式场景中达到流关联的目的。如下图官网截图所示:
join
-
regular join:即 left join,right join,full join,inner join
-
维表 lookup join:维表关联
-
temporal join:快照表 join
-
interval join:两条流在一段时间区间之内的 join
-
array 炸开:列转行
-
table function join:通过 table function 自定义函数实现 join(类似于列转行的效果,或者说类似于维表 join 的效果)
在实时数仓中,regular join 以及 interval join,以及两种 join 的结合使用是最常使用的。所以本文主要介绍这两种(太长的篇幅大家可能也不想看,所以之后的文章就以简洁,短为目标)。
3.先来一个实战案例
先来一个实际案例来看看在具体输入值的场景下,输出值应该长啥样。
场景:即常见的曝光日志流(show_log)通过 log_id 关联点击日志流(click_log),将数据的关联结果进行下发。