目录
Event-time是嵌入到数据本身的时间,所以首先 event-time 是一个基于事件的时间。对于许多的应用来说,你可能希望操作这个事件-时间。例如,如果你想获得每分钟物联网设备产生的事件数量,然后想使用数据产生时的时间(也就是数据的event-time),而不是Spark接收他们的时间。每个设备中的事件是表中的一行,而事件-时间是行中的一个列值。这就允许将基于窗口的聚合(比如每分钟的事件数)看成是事件-时间列的分组和聚合的特殊类型——每个时间窗口是一个组,每行可以属于多个窗口/组。
而且,这个模型自然处理那些比期望延迟到达的事件-时间数据。当Spark正在更新结果表时,当有延迟数据,它就会完全控制更新旧的聚合,而且清理旧的聚合去限制中间状态数据的大小。从Spark 2.1开始,我们已经开始支持水印(watermarking ),它允许用户确定延迟的阈值,允许引擎相应地删除旧的状态。
1、基于事件-时间的窗口操作
在滑动的事件-时间窗口上的聚合对于结构化流是简单的,非常类似于分组聚合。在分组聚合中,聚合的值对用户确定分组的列保持唯一的。在基于窗口的聚合中,聚合的值对每个窗口的事件-时间保持唯一的。
修改我们前面的单词计数的例子,现在当产生一行句子时,附件一个时间戳。我们想每5分钟统计一次10分钟内的单词数。例如,12:00 - 12:10, 12:05 - 12:15, 12:10 - 12:20等。注意到12:00 - 12:10是一个窗口,表示数据12:00之后12:10之前到达。比如12:07到达的单词,这个单词应该在12:00 - 12:10和12:05 - 12:15两个窗口中都要被统计。
基于事件-时间窗口的单词统计代码: