当前位置: 首页 > 知识库问答 >
问题:

Flink流-笛卡尔产品和流上的窗口

乜安志
2023-03-14

假设我有一个带有键和时间戳的流。我想在每个窗口(滑动窗口)中创建这些关键点的笛卡尔积。如果我有键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(...)

但是这将只应用每个键的算法,并且不能创建组合。

附言:我看过这个文档:https://cwiki.apache.org/confluence/display/FLINK/Streams和流操作

我认为这里提到的离散流可以做到这一点,但是它们在flink 1.2(或任何其他版本)中不可用。

共有1个答案

梁华皓
2023-03-14

流式处理上下文中的keyBy()与批处理上下文中的groupBy()具有类似的效果。根据您提供的KeySelector,流被划分为多个子流。然后将这些信息输入到您的时间窗口中。因此,在您的示例中,您当前所做的是在KeyedStream上创建一个timeWindow。进入时间窗口并在随后应用的函数中发出的所有元素都将具有完全相同的键。下面是对Flink中窗口的一个很好的介绍,详细介绍了如何使用windowshttps://flink.apache.org/news/2015/12/04/Introducing-windows.html.如果您的键包含语义信息,并且希望在同一窗口中有不同的键,则可以创建分配给记录的人工键(例如,简单整数)。基于此键,您可以更好地控制分组,从而实现流分区。对于采用前面步骤的结果并合并它们的最终计算,您需要额外的步骤(例如joinreduce)。请看这里的第一个示例:https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/datastream_api.html它使用sum()函数,在5秒钟的时间窗口中,使用给定的键对所有元素进行计数。结果将在每个窗口的每个键中包含一个元素。

 类似资料:
  • 问题内容: 我具有以下集合类型: 我想为每个Key从集合中的单个值创建每个的唯一组合。 例如,假设地图如下所示: 我想得到的结果看起来像是一个结果(排序并不重要,它只需要是由所有可能的组合组成的“完整”结果)即可: 这基本上是一个计数问题,但是我想看看使用Java 8流是否可以解决。 问题答案: 您可以使用递归链解决此问题。 首先,当我们需要在映射值之间来回移动时,最好将它们复制到(这不是深度复制

  • 例如,对于{A,B}和{X,Y}这两个流,我希望它生成值流{AX,AY,BX,BY}(简单的串联用于聚合字符串)。到目前为止,我已经想出了这段代码: 这是我想要的用例: 预期结果:。 溪流消耗在哪里?按平面地图?很容易修好吗?

  • 的结果将是二维数组: 我试图做的是使用流在Java中编写这个笛卡尔乘积函数。 到目前为止,我有以下Java版本: 我对问题的猜测是: 我需要在某个地方使用收集器(可能在之后) 标识的数据类型错误

  • 问题内容: 我想创建一个方法,该方法创建元素流,这些元素流是多个给定流的笛卡尔积(由二元运算符最后汇总为相同类型)。请注意,参数和结果都是流, 而不是 集合。 例如,对于 {A,B} 和 {X,Y}的 两个流,我希望它产生值 {AX,AY,BX,BY}的流 (简单串联用于聚集字符串)。到目前为止,我想出了以下代码: 这是我想要的用例: 预期结果:。 另一个例子: 预期结果:。 但是,如果我运行代码

  • 我有以下收藏类型: 我希望根据集合中每个键的单个值为每个创建唯一的组合。

  • 现在我只能实现两个集合的笛卡尔积,下面是代码: 这段代码在IntelliJ中运行良好,但在Eclipse中不起作用。编译器符合性级别均为1.8: 这里是Pair.java: 如何修复此错误? 有没有一种优雅的方法来实现几个集合的笛卡尔产品?假设我们有类。