背景简述
平时日常数据开发主要用idea,确实挺强大。近日写了个flink任务,非广播流和广播流合并,然后过滤处理。
处理逻辑都很通用,大概是这样:BroadcastConnectedStream的process调用了WhitelistBroadcastProcess类,该类继承BroadcastProcessFunction,并实现processElement和processBroadcastElement方法,分别处理广播流和非广播流。
问题描述
上图中红色波浪线提示错误
Cannot resolve method 'process……
提示不清楚,精简后的WhitelistBroadcastProcess类如下,没用异常提示
因为两个流以及合并处理后的流数据结构有点复杂,刚开始一起以为参数的类型有问题,可怀疑了半天也没找出问题来。
尝试一:异常
先精简WhitelistBroadcastProcess,删除所有的处理逻辑,只剩框架,还是跟上面截图一样提示错误
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.streaming.api.functions.co.BroadcastProcessFunction;
import org.apache.flink.util.Collector;
import java.util.Map;
import java.util.Set;public class WhitelistBroadcastProcess extends BroadcastProcessFunction<Tuple3<String, String, Map<String, String>>, Tuple2<String, Set<String>>, Tuple2<String, Map<String, String>>> {
@Override
public void processElement(Tuple3<String, String, Map<String, String>> value, ReadOnlyContext ctx, Collector<Tuple2<String, Map<String, String>>> out) throws Exception {}
@Override
public void processBroadcastElement(Tuple2<String, Set<String>> value, Context ctx, Collector<Tuple2<String, Map<String, String>>> out) throws Exception {}
}
尝试二:正常
换了另外一种方式尝试,直接在process里调用并实现 WhitelistBroadcastProcess类,如下图所示
这个时候idea安静下来了,不再提示红色波浪线。
shit!这两种方法不都一样的嘛,也没啥区别!
原因分析
稍作镇定,看尝试1和尝试2两个代码的区别,还真有点差别
尝试1定义WhitelistBroadcastProcess类的时候,idea自动填充,代码依赖了
import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.api.java.tuple.Tuple3;
尝试2在process函数中实现BroadcastProcessFunction子类的时候,idea自动填充,代码依赖了
import scala.Tuple2; import scala.Tuple3;
两个包里的tuple还是有区别的,具体细节自行翻阅。
总结:idea很强大,用起来很爽;使用idea自动填充功能,还是要小心注意!