2017-01-03 64 views
0

我需要将无限的键值元素的PCollection折叠到每个键集合(在每个输入应用后输出集合)。重要的是将值按正确的顺序进行折叠,并且它不像自定义组合器所支持的那样。每个密钥的吞吐量将会很低,但整体吞吐量会非常高。有没有办法让我在Dataflow中做到这一点?将元素折叠为值

回答

2

正确,合成器是无序的。这是因为无序组合在Beam模型中有很大的意义,它允许后期数据(在你的情况下,你希望什么样的行为,以防迟到的数据到达?),并且因为它承认非常有效的实现,并且在大多数情况下,这是所有需要的。你可以解决这个问题对于你的情况

的一种方式,牺牲一些效率,是实现自定义CombineFn,其中:

  • 的蓄能器,以及输出类型,是“排序输入的元素列表时间戳”。
  • 将元素插入累加器将其插入排序列表中
  • 合并两个累加器会合并排序列表。
  • 从累加器提取输出是身份函数。

基本上你将使用联合维护每个键值的排序列表,你会得到一个PCollection<KV<K, List<V>>>,到可以应用ParDo与贵了一倍。

+0

听起来好像会起作用,但随着时间的推移,这个州会不断增长 - 我希望有一个解决方案,我只需要保持聚集状态。 –

+0

我认为对于我的用例,可以按照处理时间顺序应用事件 - 所以我不必迟到,因为迟到事件只会在接收时打开的窗口中进行,对吗? –

+0

因此:鉴于即将推出的国家API(BTW即将推出?:-D),我将能够拥有一个ParDo,它可以将每个键的当前状态保留在全局窗口中,并且只需在事件进入时应用......除非那里也没有订购,在这种情况下,我必须(我认为)1)根据处理时间保留固定的时间窗口; 2)GroupByKey; 3)进入一个新的全球窗口;和4)ParDo排序并应用事件。我认为。 –