我正在使用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会收到空的可迭代,并触发到位?nil
或false
似乎不是一种选择。我正在使用Dataflow SDK 1.x。
答案 0 :(得分:0)
我怀疑你所看到的行为是&#34;准时&#34;即使窗格是空的,也可能会发出窗格。您应该具有可以作为标识的特定Record
(0表示添加,1表示乘法等)或允许Record
为null
并返回该标识。然后,组合函数需要检测records
中是否有任何空值并删除它们。
部分描述了BEAM-210 (making this behavior configurable)和BEAM-32 (making the default be only producing non-empty panes)。