我正在学习火花流,并从一些生产日志中找出一些哈希标签。
在某些示例中,我找到了以下代码:
val words = statuses.flatMap(line => line.split(" "))
val tags = words.filter(w => w.startsWith("#"))
val tagKeyValues = tags.map(tag => (tag, 1))
val tagCounts = tagKeyValues.reduceByKeyAndWindow( (x,y) => x + y, (x,y) => x - y, Seconds(300), Seconds(1))
代码运行正常。 但是我不明白这个reduceByKeyAndWindow在这里如何工作?为什么我们要减少第二个参数中的值?
答案 0 :(得分:2)
反向减少功能用于优化滑动窗口的性能。当窗口持续时间为300s且间隔持续时间为1s时,可以通过减去从新窗口中落下的1s旧数据并添加一秒钟的新数据,从先前的减少值中计算出一个新的减少值。还有reduceByKeyAndWindow
的一个版本,其中没有反函数,当该函数不可逆时,可以使用该函数。
对该算法的实现进行了详尽的注释,并且易于理解https://github.com/apache/spark/blob/5264164a67df498b73facae207eda12ee133be7d/streaming/src/main/scala/org/apache/spark/streaming/dstream/ReducedWindowedDStream.scala#L79