关于Dstream的转化操作的详细解释

本文详细解析了Spark中DStream的无状态和有状态转化操作,包括map、flatMap、filter等无状态操作,以及滑动窗口和updateStateByKey等有状态操作的特点与应用场景。

在这里插入图片描述
众所周知,在SparkCore中,RDD支持Transform和Action两种类型的算子操作,同样的,作为代表了一系列连续 RDD序列的DStream,同样也有相应的操作,如下图所示:
在这里插入图片描述
在此,我着重讲一下Dstream的转化操作。
DStream的转化操作可以分为无状态(stateless)和有状态(stateful)两种。

无状态转化操作

无状态的转化操作,就是把简单的RDD转化操作应用到每个批次上,也就是转化DStream中的每一个RDD。部分无状态转化操作列在了下表。
注意,针对键值对的DStream转化操作(比如reduceByKey())要添加import.StreamingContext._ 才能在scala中使用。和RDD一样,在Java中需要通过mapToPair()创建出一个JavaPairDStream 才能使用。

函数名称目的Scala示例用来操作DStream[T]的用户自定义函数的函数签名
map()对DStream中的每个元素应用给定函数,返回由各元素输出的元素组成的DStreamds.map(x => x+1)f:(T) -> U
flatMap()对DStream中的每个元素应用给定函数,返回由铬元素输出的迭代器组成的DStreamds.flatMap(x => x.split("\t")f:T -> Iterable[U]
filter()返回由给定DStream中通过筛选的元素组成的DStreamds.filter(x => x!=1)f:T -> T
repartition()改变DStream的分区数ds.repartition(10)N/A
reduceByKey()将每个批次中键相同的记录归约ds.reduceByKey((x,y) => x+ y)f:T,T->T
groupByKey()将每个批次中的记录根据键分组ds.groupByKey()N/A

需要记住的是,尽管这些函数看起来作用在整个流上一样,但事实上每个DStream在内部都是由许多RDD(批次)组成,且无状态转化操作是分别应用到每个RDD上的。例如,reduceByKey()会归约每个时间分区中的数据,但不会归约不同分区之间的数据。我们稍后会讲的有状态的转化操作则会整合不同时间分区内的数据。

无状态转化操作也能在多个DStream间整合数据,不过也是在各个时间区间内。例如,键值对DStream拥有和RDD一样的与连接相关的转换操作,也就是cogroup()、leftOuterJoin()等。我们可以在DStream上使用这些操作,这样就对每个批次分别执行了对应的RDD操作。
如果这些无状态转化操作不够用,DStream还提供了一个叫做transform()的高级操作符,可以让你直接操作其内部的RDD。这个transform()操作允许你对DStream提供任意一个RDD到RDD的函数。这个函数会在数据流中的每个批次中被调用,生成一个新的流。transform()的一个常见应用就是重用你为RDD写的批处理代码。例如,如果你有一个叫做extractOutliers()的函数,用来从一个日志记录的RDD中提取出异常值的RDD,你就可以在transform()中重用他。

有状态转化操作

DStream的有状态转化操作时跨时间区间跟踪数据的操作,也就是说,一些先前批次的数据也可以被用来在新的批次中计算结果。主要的两种类型是滑动窗口和updateStateByKey(),前者以一个时间阶段为滑动窗口进行操作,后者则用来跟踪每个键的状态变化。

滑动窗口

滑动窗口转换操作的计算过程如下图所示,我们可以事先设定一个滑动窗口的长度(也就是窗口的持续时间),并且设定滑动窗口的时间间隔(每隔多长时间执行一次计算),然后,就可以让窗口按照指定时间间隔在源DStream上滑动,每次窗口停放的位置上,都会有一部分DStream被框入窗口内,形成一个小段的DStream,这时,就可以启动对这个小段DStream的计算。

UpdateStateByKey

以DStream中的数据进行按key做reduce操作,然后对各个批次的数据进行累加
在有新的数据信息进入或更新时。能够让用户保持想要的不论什么状。使用这个功能须要完毕两步:

  1. 定义状态:能够是随意数据类型
  2. 定义状态更新函数:用一个函数指定怎样使用先前的状态。从输入流中的新值更新状态。
    对于有状态操作,要不断的把当前和历史的时间切片的RDD累加计算,随着时间的流失,计算的数据规模会变得越来越大。

。。。。

手打不易,转载请注明,谢谢!!!
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值