【问题标题】:Apache Flink calculate quantiles on streaming data [in scala)Apache Flink 计算流数据的分位数 [在 scala 中]
【发布时间】:2018-08-03 16:06:32
【问题描述】:

我想使用 Scala 在 Flink 中计算流数据的分位数。我的问题与flink calculate median on stream 类似但比这个更简单。我认为这可以通过定义自定义聚合函数来完成,但我正在寻找一些 Scala 示例。我查看了https://github.com/dataArtisans/flink-training-exercises 中的示例,但并没有完全找到我想要的东西。我计算了总和,计算了平均值,我想计算第 95 个百分位数。

val nwStream = env
  // TestData topic is our Kafka topic
  .addSource(kafkaConsumer)
  // configure timestamp and watermark assigner
  .assignTimestampsAndWatermarks(new TestDataTSAssigner)
  // group by stats by
  .keyBy(_.sSomeId)
  // sliding window is 5 minutes long and slides every 1 minute
  .timeWindow(Time.minutes(5), Time.minutes(1))
  .apply { (key: String, window: TimeWindow, events: Iterable[TestData],
            out: Collector[(String, Long, Long, Double, Double)]) =>
  out.collect((key, window.getEnd, events.size,
    events.map(_.stat1).sum/events.size,
    events.map(_.stat2).sum/events.size)
}

我希望能够在 collect 函数中以类似的方式计算第 95 个百分位数。有没有什么方法可以使用 FlatMap 做到这一点?如果我们可以说,那就太棒了

events.map(_.stat1).quantile(0.95)

但我知道今天没有内置的分位数功能。

任何帮助将不胜感激。

【问题讨论】:

    标签: scala apache-flink flink-streaming


    【解决方案1】:

    对整个流进行彻底准确的分位数/百分位数计算需要将整个流保持在状态,而这根本无法扩展。我建议改为使用t-digest sketch 之类的东西来进行估计。

    我不知道有人用 Flink 做过这件事,但它应该相当简单。

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 2017-01-05
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多