我正在尝试在Flink的DataStream上应用每个窗口的功能。以下是我的代码
DataStream> data = ...
DataStream> freqCityChangeTransactions = data
.keyBy(0)
.timeWindow(Time.seconds(5))
.process(new MyProcessWindowFunction());
以下是我对MyProcessWindowFunction的实现
public static class MyProcessWindowFunction
extends ProcessWindowFunction, Tuple2, String, TimeWindow> {
public void process(String key,
Context context,
Iterable<Tuple2<String, String>> input,
Collector<Tuple2<String, String>> out) {
// Do something ...
}
}
但是,当我尝试通过maven编译上面的代码时,我收到以下错误
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on project flink-examples: Compilation failure
[ERROR] /Users/furqan/Workspace/flink/src/main/java/com/baig/bank/Bank.java:[120,13] no suitable method found for process(com.baig.Bank.MyProcessWindowFunction)
[ERROR] method org.apache.flink.streaming.api.datastream.WindowedStream.process(org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction,R,org.apache.flink.api.java.tuple.Tuple,org.apache.flink.streaming.api.windowing.windows.TimeWindow>) is not applicable
ERROR R
ERROR)
[ERROR] method org.apache.flink.streaming.api.datastream.WindowedStream.process(org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction,R,org.apache.flink.api.java.tuple.Tuple,org.apache.flink.streaming.api.windowing.windows.TimeWindow>,org.apache.flink.api.common.typeinfo.TypeInformation) is not applicable
ERROR R
ERROR)
我正在使用Apache Flink 1.5.1版并在Mac上使用maven3编译Java代码。
问题是keyBy中使用的KeySelector与ProcessWindowFunction中指定的密钥类型之间存在不匹配。您已使用Tuple2中的索引指定了密钥,因此,编译器无法推断密钥将是字符串。在这种情况下,Flink将密钥作为元组传递。
有几种方法可以解决这个问题。如果按原样保留keyBy,则需要修改ProcessWindowFunction以使用Tuple作为键类型,如果要使用它,则必须将键转换为String。有点像((Tuple1)key).f0。更好的解决方案是使用更明确的键选择器,例如keyBy(t -> t.f0),以便在编译时将键称为字符串。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。