我碰到了一类问题,这些问题在批处理中是不存在的,但在流式处理的情况下似乎并不重要。让我们考虑一下经典的字数计算示例:
lines
.flatMap(_.split("\\W+"))
.map(word => (word, 1))
.keyBy(0)
.sum(1)
这将打印流中每个单词的结果,例如:
input: "foo bar baz foo"
output: (foo, 1) (bar, 1) (baz, 1) (foo, 2)
我想做的是将每一行作为一个整体进行处理,然后才打印结果,即在每一行上使用一个窗口:
input: "foo bar baz foo"
output: (foo, 2) (bar, 1) (baz, 1)
显然,基于时间和基于计数的窗口在这里都不适用。解决这个问题的正确方法是什么?
1条答案
按热度按时间1cklez4t1#
即使在批处理模式下,也无法并行处理字和行,因为嵌套
groupBy
(或keyBy
)在flink中不支持。但是,如果您需要以下批字计数的流式版本:哪里
aggregateWords
迭代该特定键的单词并对它们进行计数,然后可以按以下方式实现:对于每一行,您在末尾发出单词和一个特殊记录,然后使用一个带有自定义触发器的globalwindow,该触发器在收到特殊记录后触发。以前批处理作业的流式版本可能如下所示:
输出: