如何使用flink对数据流中每个层中计算的数量的最新值求和?

smdncfj3  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(640)

我有一个数据流(来自一个csv文件),它在每一行中包含字符串和一个特定的值(double)。我在flink中使用keyby()按特定属性(country)对这些值进行分组,因此对于每个不同的国家,我都有一组不同的元组(地层)。我计算数据流中每个组(层)的平均值和方差,并返回数量平均值/方差(μ/σ) 每一层。在我的flink程序中,当我的算法运行时,我需要对这个量的所有最后的值(均值/方差)求和,即来自每个层的最新值。换句话说,如果γ (平均值/方差)的结果,我想把γ 由于计算γ 在每一个阶层。有人能帮我解决这个问题吗?也许用一个特定的flink操作符?

xghobddn

xghobddn1#

当您在流上执行计算时,您永远不知道是否或何时会有更多的数据到达,因此典型的方法是将每个事件当作最后一个事件来处理,因此继续并为每个事件生成一个结果。然后通过响应下一个事件而生成的结果将其作废或更新。
除非您正在进行窗口处理,否则在这种情况下,每个窗口都可以被视为一个有限批处理。
在您的例子中,既然输入是一个csv文件,为什么不将其视为一个批处理计算呢?
但不管您想要批处理还是流式处理,我都建议您看看flink的table和sqlapi,它们支持将均值和方差作为内置聚合函数进行计算。可以将文件系统连接器与旧的csv格式一起使用。
你能用datastreamapi做这个吗?是的,但是。。。
如果您是在windows中进行此计算,那么是的,这很简单。只需在一个 ProcessWindowFunction . 它 process 方法将通过 Iterable 包含分配给窗口的所有事件,从中可以计算平均值、方差等。
但是,没有窗口(或批处理),不,不是真的。在无界输入上以纯流方式计算方差是不可伸缩的。必须以状态存储所有事件,在每个事件之后,更新平均值,然后重新计算每个事件和平均值之间的所有平方差。

相关问题