当使用重复触发时,Combine.perKey接收空组

时间:2017-05-03 16:54:32

标签: google-cloud-dataflow

我正在使用Combine.perKey将多个记录合并到Dataflow中。我发现如果我使用以下窗口,我的自定义SerializableFunction有时会收到一个空的迭代。

p.apply(TextIO.Read.from(INPUT))
.apply(ParDo.of(new ParseRecords()))
.apply(Window.<Record>into(FixedWindows.of(Duration.standardHours(24)))
  .triggering(Repeatedly.forever(AfterProcessingTime.pastFirstElementInPane()
  .plusDelayOf(Duration.standardMinutes(1))))
.discardingFiredPanes()
.apply(ParDo.of(new SetKey()))
.apply(Combine.<String, Record>perKey(new CombineRecords()))

// ...

static class CombineRecords implements SerializableFunction<Iterable<Record>, Record> {
  @Override
  public Record apply(Iterable<Record> records) {
    // sometimes, records has no items
    return Iterables.get(records, 0, null);
  }
}

如果我删除triggering,那么该函数永远不会收到空的迭代。

我的问题是:

  • 是否期望处理Combine.perKey的SerializableFunction会收到空的可迭代,并触发到位?
  • 如果是这样,没有要合并的记录,SerializableFunction如何处理?返回nilfalse似乎不是一种选择。

我正在使用Dataflow SDK 1.x。

1 个答案:

答案 0 :(得分:0)

我怀疑你所看到的行为是&#34;准时&#34;即使窗格是空的,也可能会发出窗格。您应该具有可以作为标识的特定Record(0表示添加,1表示乘法等)​​或允许Recordnull并返回该标识。然后,组合函数需要检测records中是否有任何空值并删除它们。

部分描述了BEAM-210 (making this behavior configurable)BEAM-32 (making the default be only producing non-empty panes)