大数据spark

Structured Streaming中的Join

2018-11-30  本文已影响3人  阿猫阿狗Hakuna

       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)。下面是个简单的例子:


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约束,这样引擎就可以计算出一个输入的旧行何时不需要与另一个输入进行匹配。

代码如下所示:


image.png

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

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


image.png
警告
下表为structured streaming支持的join
image.png

欢迎关注公众号:


image.png
上一篇 下一篇

猜你喜欢

热点阅读