【Flink】如何定义一个HashSet的ValueState?

在之前用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>>() {})));
}

至此,问题得以解决。

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值