Java Apache Beam会话窗口化和跨PCollection连接

Java Apache Beam会话窗口化和跨PCollection连接,java,google-cloud-dataflow,apache-beam,Java,Google Cloud Dataflow,Apache Beam,我们有两个具有相同密钥(userId)的事件流S1和S2。是否可以在两个集合之间应用会话窗口,以便在任一流中出现密钥X都将有助于会话?这会在PCollections上创建窗口,让我们在以后加入这些集合吗 上下文: 我们正在使用DataFlowRunner S1和S2都是来自PubSubIO的无界集合 非常感谢 这是正确的-您可以这样做,因为当您执行分组操作时,windows将发挥作用。这意味着您可以执行以下简单操作: p=beam.Pipeline(…) #假设时间戳信息已经在流中 firs

我们有两个具有相同密钥(userId)的事件流S1和S2。是否可以在两个集合之间应用会话窗口,以便在任一流中出现密钥X都将有助于会话?这会在PCollections上创建窗口,让我们在以后加入这些集合吗

上下文:

  • 我们正在使用DataFlowRunner
  • S1和S2都是来自PubSubIO的无界集合

非常感谢

这是正确的-您可以这样做,因为当您执行分组操作时,windows将发挥作用。这意味着您可以执行以下简单操作:

p=beam.Pipeline(…)
#假设时间戳信息已经在流中
first_stream=p | ReadMyFirstStream()| beam.WindowInto(window.Sessions(…)
second_stream=p | ReadMySecondStream()| beam.WindowInto(window.Sessions(…)
连接的\u流=(
{'first':第一个_流,
“第二个”:第二个\u流}
|beam.CoGroupByKey())
联接流PCollection将生成窗口,其中来自两个流的元素被分组在一起



这在Java中也适用。为了简单起见,我回答说使用Python。如果您喜欢Java代码,请告诉我。

谢谢Pablo。这到底是怎么回事?这两个会话对象必须是相同的实例还是相同的配置就足够了?beam如何在集合之间保持状态?这些窗口是如何对齐的?我们要做的是创建会话,其中S1中的元素与S2中的元素位于同一会话中,假设它们之间的距离不超过
gapDuration
。再次感谢!对,所以-这是Beam的一个非直观特性,但开窗P仅“标记”元素的窗口,但它们在到达分组操作(有状态DoFn、GroupByKey、CoGroupByKey)时生效。当您将两个PCollection传递到CoGroupByKey中时,它们是按键+窗口进行分组的-因此,事实上,窗口必须相同,才能再次将它们分组到CHANKS中。因此,这意味着如果会话相同,我们可以对它们进行分组。但是,会议是否也会对这两种投入产生影响?例如,如果我们的gapDuration为30m,项目在流S1和S2上发出,如下所示:
S1:S1_1@1ms1_2@60ms1_3@65m
S2:S2_1@19ms2_2@65m
,我们会得到(s1_1,s2_1),(s1_2,s2_2,s1_3)的会话,还是只得到(s1_1),(s2_1),(s1_2,s1_3),s(2_2)的会话?我希望这是有意义的:)对,会话对两个输入都有效(会话将是(s1_1,s2_1),(s1_2,s2_2,s1_3))