我的任务等同于:
我的管道如下:
| 'Extract and assign timestamps' >> Map(..)
| 'Extract author from message' >> Map(..)
| 'Assign author as key' >> Map(lambda x: (x.author, x)) # :(author,chr)
| 'Assign windows' >> WindowInto(window.FixedWindows(5*60),
trigger=Repeatedly(AfterAny(
AfterCount(2),
AfterWatermark())),
accumulation_mode=ACCUMULATING)
| 'Group letters by author' >> GroupByKey() # :(author,[chr])
| 'Extract many ngrams from every substring' >> ParDo(..) # :[(author, ngram)]
| 'Re-key by ngrams' >> Map(lambda x: (x.ngram, 1)) # :(ngram,1)
| 'Group again, now by ngrams' >> GroupByKey() # :(ngram,[1])
| 'Sum ngrams counts' >> Map(lambda x: (x[0], sum(x[1]))) # :(ngram,count)
| 'Re-key by window' >> ParDo(..) # :(window, (ngram,count))
| 'Group within window' >> GroupByKey # :(window, [(ngram,count)])
我的目标是每两个输入消息接收一条输出消息,以便输出消息总结介于以下两个事件之间的ngram统计:事件时间当前5分钟间隔的开始,以及处理时间当前时刻。 / p>
没有AfterCount
触发器,一切运行良好:每个窗口只有一个窗格。在事件发生的每5分钟我收到一条直方图消息。
此管道实际上并没有按预期的方式在每个窗口中包含多个窗格,因为我在这里有3个GBK,每个GBK由窗格触发,并且通过累积进行。例如:
('a','author1')
和('b','author1')
之后,窗格会在所有 GBK s中触发; ('[0,300)', [('ab', 1)])
; ('author1','a')
和('author1','b')
); ('ab',1)
;和('[0,300)',('ab',1))
('c','author1')
和('d','author2')
时,所有GBK都会使用缓冲的东西重新触发:
('a','author1')
,('b','author1')
,('c','author1')
,('d','author2')
,并正确发出:('author1',['a','b','c'])
和('author2',['d'])
('ab',1,)
以及新发出的('bc',1)
并重新发出('ab',1)
-并开始复制(并在同一窗口的每个窗格上级联)。('[0,300)',[('ab',2),('bc',1)])
,而应该是('[0,300)',[('ab',1),('bc',1)])
这是我的想法:
这种管道的合适解决方案是什么?我该如何在第一个GBK之前进行累积,而在其他两个GBK之前进行丢弃-但是要确保所有三个GBK的窗格都围绕同一数据(或其派生数据)关闭?