flink流-笛卡尔积和流上窗口

yx2lnoni  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(642)

假设我有一个带有密钥和时间戳的流。我想在每个窗口(滑动窗口)中创建这些键的笛卡尔积。如果我有1,2,3,4键,并且我已经将并行度设置为2,我想用以下方式对它们进行“分组”:

1 - 2    2 - 3
1 - 3    2 - 4
1 - 4    3 - 4

我要处理每个窗口中每个组的元素。因此,假设上述元素(1、2、3、4)在同一个窗口中,基于它们的时间戳。
以最简单的形式,我的问题是:给定每个滑动窗口中的一些元素(可能包含多个键),我想创建这些键的组合,如上面的示例所示,并对这些分组的元素应用自定义算法。
到目前为止,我尝试的是

.assignAscendingTimestamps(...)
.keyBy(...)
.timeWindow(Time.seconds(5),Time.seconds(5))
.apply(...)

但这只会对每个键应用一个算法,而且不能创建组合。
p、 s:我看过这个文件:https://cwiki.apache.org/confluence/display/flink/streams+and+operations+on+streams
我认为这里提到的离散化流可以做到这一点,但它们在Flink1.2(或任何其他版本)中都不可用。

de90aj5v

de90aj5v1#

这个 keyBy() 在流媒体环境中的效果与 groupBy() 在批处理上下文中。基于 KeySelector 您提供的流被划分为多个子流。然后把它们喂进你的肚子里 timeWindow . 因此,您当前在示例中所做的是 timeWindowKeyedStream . 所有进入你身体的元素 timeWindow 和被发射到你以后应用的函数中会有完全相同的键。这里有一个很好的介绍窗口在Flink,进入一些更详细的介绍如何使用窗口https://flink.apache.org/news/2015/12/04/introducing-windows.html. 如果您的键包含语义信息,并且希望在同一窗口中有不同的键,则可以创建一个分配给记录的人工键(例如,一个简单的整数)。基于这个键,您可以更好地控制分组和流分区。对于将前面步骤的结果合并到一起的最终计算,您需要额外的步骤(例如。 join 或者 reduce ). 请看这里的第一个示例:https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/datastream_api.html 它用一个给定的键计算一个数组中的所有元素 timeWindow 使用 sum() 功能。结果将在每个窗口的每个键中包含一个元素。

相关问题