我有一个Alert
类型的Flink DataStream。我想在DataStream[(String, somecaseclass)]
Tuple
的第一个字段上进行分组,并创建一个String
。以下是我的尝试:
ListBuffer[somecaseclass]
但是这给了我一行输出,这意味着如果有10个输入行,第一行输出行只是在第一行连接,第十行给出了十行的连接输出。但是,我只想要第十排。我检查了Flink val emptylistbuffer = new ListBuffer[somecaseclass]
inputstream
.keyBy(0)
.fold(emptylistbuffer){case(outputbuffer,b) => {outputbuffer+=b._2}}
上几乎所有的转换,但没有任何内容适合用例。
输入:
DataStream
预期产出:
(filename1.dat,somecaseclass("abc","1",2))
(filename1.dat,somecaseclass("dse","2",3))
(filename1.dat,somecaseclass("daa","1",4))
答案 0 :(得分:1)
DataStream API认为DataStream
是无限制的。这意味着DataStream
可能提供无限数量的记录。因此,在收到所有记录后,不可能“仅”发出聚合结果(在您的情况下为完整的ListBuffer
),因为可能有更多记录需要聚合(添加到{{ 1}})。原则上,ListBuffer
上的聚合永远不会产生最终结果,因为可能会有更多记录。由于这不太实用,Flink的DataStream API会为每个传入记录生成一个新结果。
在无界流上计算聚合的常用方法是窗口。 Windows在流上定义有界部分,可以在其上计算聚合并发出最终结果。 Flink根据时间或记录计数提供内置窗口。例如,您在1小时的翻滚窗口上的记录收集功能将收集在一小时内到达的所有记录。
请查看different window types的Flink文档以及如何使用它们。