我需要计算从kafka流接收到的许多参数的中间值15分钟。
我找不到任何内置功能,但是我找到了一种使用自定义窗口函数的方法。
我的问题是:
- Flink是一项艰巨的任务吗?数据可能很大。
- 如果数据到达GIGA字节,将截断将所有内容存储在内存中,直到时间窗口结束?(应用窗口函数实现的参数之一是迭代的 - 在时间窗口期间出现的所有数据的集合)
谢谢
您的问题包含几个方面,但让我回答最基本的问题:
这是Flink的艰巨任务,为什么这不是标准示例?
是的,中位数是一个很难的概念,因为确定它的唯一方法是保留完整的数据。
许多统计信息不需要计算的完整数据。例如:
- 如果您有总和,则可以获取先前的总和并添加最新的观察。
- 如果您有总数,则添加1并拥有新的总数
- 如果您有平均值,在引擎盖下,您只需跟踪总和和计数,并且在任何时候根据观察值计算新的平均值。
这甚至可以使用更复杂的指标来完成,例如标准偏差。
然而,没有什么快捷方式来确定中位数,添加新观察后中位数的唯一方法是查看所有观察结果,然后弄清楚中间是什么。
。因此,这是一个具有挑战性的指标,并且需要处理数据的大小。如前所述,在这样的工作中可能会有估计值:https://issues.apache.org/jira/browse/browse/flink-2147
另外,您可以查看数据的分布方式,也许可以用含义,偏斜和峰度等指标估算中位数。
我可以提出的最终解决方案是,如果您需要大约知道该值应该是什么,那就是选择一些"候选人",并计算其下方观测的分数。最接近50%的人将是一个合理的估计。