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
.
- reduce the new values that entered the window (e.g., adding new counts)
- "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)。
我正在学习 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
.
- reduce the new values that entered the window (e.g., adding new counts)
- "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)。