Apache flink 在Flink中有使用直方图累加器的例子吗

Apache flink 在Flink中有使用直方图累加器的例子吗,apache-flink,Apache Flink,我无意中发现了Flink层次结构中的Histogram类,但是没有“这里是如何使用此”之类的文档。我想做一些事情,比如: dataStream .countWindowAll(100) .fold(new Histogram(), (histogram,data) -> {histogram.add(data.getValue()); return histogram;}) .flatmap((h, out) -> h.getLocalValue().navi

我无意中发现了Flink层次结构中的Histogram类,但是没有“这里是如何使用此”之类的文档。我想做一些事情,比如:

dataStream
    .countWindowAll(100)
    .fold(new Histogram(), (histogram,data) -> {histogram.add(data.getValue()); return histogram;})
    .flatmap((h, out) -> h.getLocalValue().navigableKeySet.iterator().forEachRemaining(key -> out.collect(key.toString()+","+h.get(key).toString()))
    .print()
但遗憾的是,
直方图
无法通过Flink序列化。也许有一个“这是你可以使用它的方法”,或者有另一种方法通过flink获得直方图


很明显,我做错了什么。

弗林克的累加器并不打算用作
数据流
数据集
的数据类型

相反,它们是通过
RuntimeContext
注册的,可从
RichFunction.getRuntimeContext()获得。这通常在
rich函数的open()方法中完成:

class MyFunc extends RichFlatMapFunction[Int, Int] {

  val hist: Histogram = new Histogram()

  override def open(conf: Configuration): Unit = {
    getRuntimeContext.addAccumulator("myHist", hist)
  }

  override def flatMap(value: Int, out: Collector[Int]): Unit = {
    hist.add(value)
  }
}
累加器的所有并行实例都定期发送到JobManager(主进程)并合并。可以从
StreamExecutionEnvironment.execute()
返回的
JobExecutionResult
中访问它们的值


我认为Flink的累加器无法解决您的用例。您应该创建自定义直方图数据类型

我也面临同样的问题,你有解决办法吗。FlinkAPI没有很好的文档记录,因为它没有足够的示例