无法通过使用SampleClass的字段作为参数对类型为的Flink窗口流执行“maxBy”< SampleClass>不起作用

vuktfyat  于 2023-03-27  发布在  Apache
关注(0)|答案(1)|浏览(149)

假设这是我的示例流,如下所示:

SingleOutputStreamOperator<Tuple2<String, SampleClass>> sampleStream = previousStream
                                    .keyBy(value -> value.f1.getId())
                                    .window(TumblingProcessingTimeWindows.of(Time.seconds(1)))

SampleClass有两个字段idtime,还有两个getter方法getId()getTime,分别用于获取这两个字段。
目标:现在我想对上面的流执行maxBy操作,并将time作为最大化的条件。基本上,我希望窗口前面的元素是最新的。
我如何实现我的目标?
maxBy作用于参数的位置,而不是参数内部的嵌套字段。例如:

.maxBy(positionToMaxBy = 1, first = true)

这里positionToMaxBy会考虑流参数中的第二个参数,也就是对象。但是我如何让它使用getTime()方法来代替整个对象呢?

gab6jxml

gab6jxml1#

一些解决方案:

  • 在应用将Tuple2<String, SampleClass>转换为SampleClass的窗口之前使用贴图
  • 或者如果需要String,将其添加到SampleClass
  • 使用reduce代替maxBy
  • SampleClass上实现Comparable,并让compareTo方法只检查时间字段

相关问题