在之前用Flink的ValueState时,我总会把ValueStateDescriptor<Integer>("count", Integer.class)的第二个参数写作XXX.class,导致今天在测试时,无法把HashSet.class作为参数给ValueStateDescriptor。
于是我尝试用Class.forName来传入HashSet:
ValueState<HashSet<Integer>> set ;
@Override
public void open(Configuration parameters) throws Exception {
set = getRuntimeContext().getState(new ValueStateDescriptor<HashSet<Integer>>("hashSet", (Class<HashSet<Integer>>) Class.forName("java.util.HashSet")));
}
虽然问题得以解决,但是参数名过于冗余,我便查看Flink的源代码,寻找其他思路:
public ValueStateDescriptor(String name, Class<T> typeClass) {
super(name, typeClass, (Object)null);
}
public ValueStateDescriptor(String name, TypeInformation<T> typeInfo) {
super(name, typeInfo, (Object)null);
}
public ValueStateDescriptor(String name, TypeSerializer<T> typeSerializer) {
super(name, typeSerializer, (Object)null);
}
翻阅ValueStateDescriptor的源码,我发现,ValueStateDescriptor并不是只能传入Class这一种参数,还可以传入TypeInformation,TypeSerializer,我便想到了第二种方法:
ValueState<HashSet<Integer>> set;
@Override
public void open(Configuration parameters) throws Exception {
pvCount = getRuntimeContext().getState(new ValueStateDescriptor<Integer>("pvCount", Integer.class));
set = getRuntimeContext().getState(new ValueStateDescriptor<HashSet<Integer>>("uvCount", TypeInformation.of(new TypeHint<HashSet<Integer>>() {})));
}
至此,问题得以解决。