Spark 流式窗口函数 reduceByKeyAndWindow(

Spark Streaming Windowing Function reduceByKeyAndWindow(

我正在学习 Spark Streaming,我遇到了函数 reduceByKeyAndWindow。官方文档好像传了两个lambda函数

reduceByKeyAndWindow(lambda x, y: x + y, lambda x, y: x - y, 30, 10)

我有点疑惑,为什么要传递第二个函数。据我所知,一个减少价值的功能就足够了。我想知道第二个函数有什么意义

第一个函数是实际的 reduce 函数。在这种情况下,您添加元素。第二个是 reduce 函数的 inverse,它“撤消”reduce 计算的内容,即执行减法。

例如,考虑具有重叠值的 window:

stream 2 3 5 8 1 ...

reduce = add
2 3 5 3 5 8 5 8 1 ...
|___| |___| |___| 
  10    16    14  

现在在示例中,您可以通过添加 3+5+8 来获得 16,但是由于您已经拥有 2+3+5,因此您可以通过删除 2 来“反向减少”,即您执行减法(记住:reduce 是和,reduce 的倒数是减法)。

10-2

然后添加8。因此,不是计算 (3+5) + 8 = 16,而是计算 (10-2) + 8 = 16.

来自源代码https://github.com/apache/spark/blob/master/streaming/src/main/scala/org/apache/spark/streaming/dstream/DStream.scala

  1. reduce the new values that entered the window (e.g., adding new counts)
  2. "inverse reduce" the old values that left the window (e.g., subtracting old counts)

优点是可以避免重复相同的计算。我假设缓存值也可以带来一些性能优势。

请注意,这只能用于可逆函数(另请参阅 https://spark.apache.org/docs/latest/streaming-programming-guide.html#window-operations)。