Spark StructStreaming 流计算中的数据关联
在上一讲,我们提到,Structured Streaming 会复用 Spark SQL 所提供的一切数据处理能力,比如数据抽取、过滤、分组聚合、关联、排序,等等。不过,在这些常规的数据处理类型中,有一类操作需要我们特别关注,它就是数据关联(Joins)。
这主要是出于两方面的原因,一来,数据关联的应用非常普遍,可以说是数据应用中“出场率”最高的操作类型之一;再者,与批处理中的数据关联不同,流计算中的数据关联,还需要考虑到流处理过程中固有的一些限制,比如说时间窗口、数据延迟容忍度、输出模式,等等。
因此,今天这一讲,我们专门来说一说 Structured Streaming 中的数据关联。我们先盘点好 Structured Streaming 的技能树,看看它都支持哪些种类的数据关联。之后再用一个短视频推荐的例子上手试验一下,总结出不同类型数据关联的适用场景以及注意事项。
流计算中的数据关联
我们知道,如果按照关联形式来划分的话,数据关联可以分为 Inner Join、Left Join、Right Join、Semi Join、Anti Join,等等。如果按照实现方式来划分的话,可以分为 Nested Loop Join、Sort Merge Join 和 Hash Join。而如果考虑分布式环境下数据分发模式的话,Join 又可以分为 Shuffle Join 和 Broadcast Join
而在流计算的场景下,按照数据来源的不同,数据关联又可以分为“流批关联”与“双流关联”。所谓“流批关联”(Stream-Static Join),它指的是,参与关联的一张表,来自离线批数据,而另一张表的来源,是实时的数据流。换句话说,动态的实时数据流可以与静态的离线数据关联在一起,为我们提供多角度的数据洞察。
而“双流关联”(Stream-Stream Join),顾名思义,它的含义是,参与关联的两张表,都来自于不同的数据流,属于动态数据与动态数据之间的关联计算,如下图所示。
显然,相对于关联形式、实现方式和分发模式,数据来源的分类标准与前三者也是相互正交的。我们知道,基于前 3 种分类标准,数据关联已经被划分得足够细致。再加上一种正交的分类标准,数据关联的划分,只会变得更为精细。
更让人头疼的是,在 Structured Streaming 流计算框架下,“流批关联”与“双流关联”,对于不同的关联形式,有着不同的支持与限制。而这,也是我们需要特别关注流处理中数据关联的原因之一。
接下来,我们就分别对“流批关联”和“双流关联”进行展开,说一说它们支持的功能与特性,以及可能存在的限制。本着由简入难的原则,我们先来介绍“流批关联”,然后再去说“双流关联”。
流批关联
为了更好地说明流批关联,咱们不妨从一个实际场景入手。在短视频流行的当下,推荐引擎扮演着极其重要的角色,而要想达到最佳的推荐效果,推荐引擎必须依赖用户的实时反馈。
所谓实时反馈,其实就是我们习以为常的点赞、评论、转发等互动行为,不过,这里需要突出的,是一个“实时性”、或者说“及时性”。毕竟,在选择越来越多的今天,用户的兴趣与偏好,也在随着时间而迁移、变化,捕捉用户最近一段时间的兴趣爱好更加重要。
假设,现在我们需要把离线的用户属性和实时的用户反馈相关联,从而建立用户特征向量。显然,在这个特征向量中,我们既想包含用户自身的属性字段,如年龄、性别、教育背景、职业,等等,更想包含用户的实时互动信息,比如 1 小时内的点赞数量、转发数量,等等,从而对用户进行更为全面的刻画。
假设,现在我们需要把离线的用户属性和实时的用户反馈相关联,从而建立用户特征向量。显然,在这个特征向量中,我们既想包含用户自身的属性字段,如年龄、性别、教育背景、职业,等等,更想包含用户的实时互动信息,比如 1 小时内的点赞数量、转发数量,等等,从而对用户进行更为全面的刻画。
一般来说,实时反馈来自线上的数据流,而用户属性这类数据,往往存储在离线数据仓库或是分布式文件系统。因此,用户实时反馈与用户属性信息的关联,正是典型的流批关联场景。
那么,针对刚刚说的短视频场景,我们该如何把离线用户属性与线上用户反馈“合二为一”呢?为了演示流批关联的过程与用法,咱们自然需要事先把离线数据与线
标签:Join,离线,用户,关联,流批,Spark,数据,StructStreaming From: https://blog.csdn.net/2401_84052244/article/details/140955783