我有一个数据流(来自csv文件(,它包含字符串和每行中的特定值(双精度(。我在Flink中使用keyBy((将这些值按特定的属性(country(分组,因此我为每个不同的国家都有一组不同的元组(stratum(。我计算数据流中每组(地层(的平均值和方差,并返回每个地层的数量平均值/方差(μ/σ(。在我的Flink程序中,当我的算法运行时,我需要将这个量的所有最后值(均值/方差(相加,即来自每个阶层的最新值。换句话说,如果每个地层产生一个量γ(平均值/方差(,我想对每个地层中计算γ所得的γ的所有最后值求和。有人能帮我解决这个问题吗?也许可以使用特定的Flink运算符?
当您对流执行计算时,您永远不知道是否或何时会有更多的数据到达,因此典型的方法是将每个事件视为最后一个事件,因此继续为每个事件生成结果。然后通过响应下一个事件所产生的结果使其过时或更新。
除非你正在进行窗口化,在这种情况下,每个窗口都可以被视为一个有限的批。
在您的情况下,既然输入是CSV文件,为什么不将其视为批量计算呢?
但是,无论您想要批处理还是流式处理,我都建议您查看Flink的Table和SQLAPI,它们支持将均值和方差作为内置聚合函数进行计算。您可以使用旧csv格式的文件系统连接器。
你能用数据流API来实现这一点吗?是的,但是。。。
如果你在windows中进行计算,那么是的,这很简单。只需在ProcessWindowFunction
中实现您的业务逻辑。它的process
方法将传递一个Iterable
,其中包含分配给窗口的所有事件,您可以从中计算平均值、方差等。
但是,如果没有窗口(或批处理(,不,不是真的。在无界输入上以纯粹的流式方式计算方差是不可伸缩的。您必须将所有事件存储在状态中,在每个事件之后,更新平均值,然后重新计算每个事件与平均值之间的所有平方差。