为了账号安全,请及时绑定邮箱和手机立即绑定

Structured Streaming中的Join

标签:
Spark

       Structured Streaming支持流式Dataset/DataFrame和静态Dataset/DataFrame的Join,也支持和另一个流式Dataset/DataFrame的Join。Join的结果是增量生成的,类似于流的聚合。这节中我们将会探索Structured Streaming支持何种类型的join(例如,inner,outer等)。请记住,不管是使用哪种类型的join,对于拥有相同数据的流式Dataset/DataFrame和静态Dataset/DataFrame,其结果是相同的。

一.Stream-static Joins(流-静态 Joins)

       自Spark 2.0版本起,Structured Streaming就已经支持了流式Dataset/DataFrame与静态Dataset/DataFrame之间的join(inner join,一些类型的outer join)。下面是个简单的例子:


webp

image.png


       请记住,stream-static joins没有状态,所以不需要状态存储。然后,某些类型的stream-static outer joins现在还没有被支持。

二.Stream-Stream Joins(流-流 Joins)

       自Spark 2.3版本起,我们已经加入了对Stream-Stream Joins的支持。对于两个数据流做join的挑战在于:在任何时候,两遍数据集的视图都是不完整的,这使得在输入之间查找匹配变得更加困难。从一个输入流接收到的任何行都可以与来自另一个输入流的将来的任何尚未接收到的行匹配。因此,我们对两端输入流的过往数据进行缓存,这样我们就可以用它来匹配以后的输入数据,从而产生join的结果。此外,和流聚合一样,我们使用watermark机制自动的处理迟到数据以及限制state的存储。

1.Inner Joins(内连接)—— watermark可选

       任何类型的列以及join条件都是支持的。然而,随着流的运行,其state会无限的增大。为了避免这种无限增大的state,必须定义额外的join条件,使得过于旧的输入数据无法与将来的输入数据进行匹配,因此可以在state中清除它。换句话说,必须在join中做如下附加步骤:
(1)在两端的输入数据上定义watermark,以便引擎知道其延迟的程度;
(2)在两端输入数据上定义event-time约束,这样引擎就可以计算出一个输入的旧行何时不需要与另一个输入进行匹配。

代码如下所示:


webp

image.png

2.Outer Joins(外连接)—— watermark必须有

       对于内连接来说,watermark+event-time约束是可选的,对于左外和右外连接来说,它们是必须指定的。这是因为对于outer join中产生的NULL记录,引擎必须知道输入行在将来的什么时候不再匹配。一个outer join查询看起来与前面的示例非常相似,只是会有一个额外的参数将其指定为outer join。


webp

image.png

警告
  • outer join的NULL记录会被延迟产生,延迟的时间取决于设定的watermark延时以及时间范围条件。这是因为引擎必须等待以确保现在和将来都不会再有匹配。

  • 如果join的两个输入流中的任意一个在一段时间内没有接收到数据,output join的输出将会被延迟。

下表为structured streaming支持的join

webp

image.png



作者:阿猫阿狗Hakuna
链接:https://www.jianshu.com/p/7a7c2aaa47e8


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消