DStream 的转化分为 无状态 (stateless) 和 有状态 (stateful) 两种

无状态转化

无状态转化会将操作应用在 DStream 中的每个 RDD 上, 且不同时间区间的 RDD 互不影响

有状态转化操作

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

滑动窗口

滑动时间间隔决定了 SS 程序对数据进行统计和分析的频率。它指的是经过多长时间窗口滑动一次形成新的窗口,滑动时间间隔默认情况下和批处理时间间隔相同,而窗口时间间隔一般设置的要比它们两个大。在这里必须注意的一点是滑动时间间隔和窗口时间间隔的大小一定得设置为批处理时间间隔的整数倍。

如以下代码:

sc = SparkContext(master, appName)
ssc = StreamingContext(sc, 1)
lines = sc.socketTextStream("localhost", 9999)
words = lines.flatMap(lambda line: line.split(" "))

windowed_words = words.window(60, 10)  # 滑动窗口操作, 第一个参数是窗口大小,第二个参数是滑动时间间隔

这里使用了一个滑动窗口操作, 返回一个新的 DStream, 它里边每一个数据块都包含过去 60 秒内的词语,而且这样的块每10秒生成一个.

这样就可以根据这个 DStream 实现每 10秒 输出 过去60秒的 热门词汇 的类似需求