Apache flink 弗林克计算中位数

Apache flink 弗林克计算中位数,apache-flink,Apache Flink,我需要计算15分钟时间窗口内从卡夫卡流接收到的许多参数的中值 我找不到任何内置函数,但我找到了一种使用自定义WindowFunction的方法 我的问题是: 这对弗林克来说是一项艰巨的任务吗?数据可能非常大 如果数据达到千兆字节,flink会将所有数据存储在内存中直到时间窗口结束吗?(apply WindowFunction实现的一个参数是Iterable—时间窗口期间所有数据的集合) 谢谢你的问题包含几个方面,但让我回答最基本的一个: 这对Flink来说是一项艰巨的任务,为什么这不是一个标准示

我需要计算15分钟时间窗口内从卡夫卡流接收到的许多参数的中值

我找不到任何内置函数,但我找到了一种使用自定义WindowFunction的方法

我的问题是:

  • 这对弗林克来说是一项艰巨的任务吗?数据可能非常大
  • 如果数据达到千兆字节,flink会将所有数据存储在内存中直到时间窗口结束吗?(apply WindowFunction实现的一个参数是Iterable—时间窗口期间所有数据的集合)

  • 谢谢

    你的问题包含几个方面,但让我回答最基本的一个:

    这对Flink来说是一项艰巨的任务,为什么这不是一个标准示例?

    是的,中位数是一个很难理解的概念,因为确定它的唯一方法是保留完整的数据

    许多统计数据不需要计算全部数据。例如:

    • 如果您有总和,则可以取上一个总和并添加最近的观测值
    • 如果有总计数,则添加1并获得新的总计数
    • 如果你有平均值,你可以在幕后记录总数和计数,并在任何时候根据观察结果计算新的平均值
    这甚至可以通过更复杂的指标来实现,比如标准差

    然而,确定中位数没有捷径可走,添加新观测值后知道中位数是什么的唯一方法是查看所有观测值,然后找出中间的那个

    因此,这是一个具有挑战性的指标,需要处理传入数据的大小。如前所述,工作中可能存在如下估算:

    或者,您可以查看数据是如何分布的,或许可以使用均值、偏斜和峰度等指标来估计中值


    我能想到的最后一个解决方案是,如果你需要知道这个值应该是多少,那就是挑选几个“候选对象”,并计算它们下面的观察值。最接近50%的那一个将是一个合理的估计。

    您能告诉我们一些有关传入数据的信息吗?我们说的是整数还是浮点数?如果是整数,您是否有已知的数据范围?在一天结束时,问题是对大量数字进行排序。如果我们只是谈论千兆字节,听起来你可以在内存中处理它。如果不是,你可以考虑外部合并排序(使用flink很容易)。如果你对确切的结果不感兴趣,你也可以考虑估算:CountMinSketch可能是你的朋友。数据是来自kafka的日志事件。基本上,这些是大约20个加载时间度量,范围为0到30000(int)。通常小于10000。。我需要通过数千个维度组合进行聚合,比如网站、页面、浏览器等等——计算平均值、中值、百分位数。我找不到count min sketch的文档。表api看起来也很有趣,但我没有';我也找不到中间值谢谢!这里有一些关于实现count min草图的讨论:我希望Flink的文档有更多的例子