6 个回答
RoaringBitmap去重:BitMap固然好用,但是对去重的字段只能用int或者long类型;但是如果去重字段不是int或者long怎么办呢?那我们就构建一个字段与BitIndex的映射关系表,通过MapFunction拿到字段对应的BitIndex之后,就可以直接进行去重逻辑了。
发布于:3个月前 (02-06) IP属地:四川省
基于外部数据库实现去重:选择使用Redis或者HBase存储数据,我们只需要设计好存储的Key即可,不需要关心Flink任务重启造成的状态丢失问题;其他的类似Mysql、Doris、CK的更新模型等;
发布于:3个月前 (02-06) IP属地:四川省
基于BitMap实现去重:用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此可以大大节省存储空间。
发布于:3个月前 (02-06) IP属地:四川省
基于布隆过滤器+状态后端+redis实现去重:类似Set集合,用于判断当前元素是否存在当前集合中。布隆过滤器,当前的key是否存在容器中,不存在直接返回。
优点:插入和查询效率是非常的高
缺点:不能百分之百的保证精确。
发布于:3个月前 (02-06) IP属地:四川省
基于HyperLogLog实现去重:HyperLogLog是去重计数的利器,能够以很小的精确度误差作为trade-off大幅减少空间占用,在不要求100%准确的计数场景极为常用
优点:高效,占用空间少
缺点:近似去重
发布于:3个月前 (02-06) IP属地:四川省
mapState/ValueState+状态后端实现去重:
使用RocksDBStateBackend,因为数据是存储在磁盘上,元数据保存在内存中。适合非常大的状态。在算子中,使用MapState数据结构,对key进行保存。数据来了查看MapState是否存在,存在 + 1,不存在设置为1。
使用RocksDBStateBackend,因为数据是存储在磁盘上,元数据保存在内存中。适合非常大的状态。在算子中,使用MapState数据结构,对key进行保存。数据来了查看MapState是否存在,存在 + 1,不存在设置为1。
优点:精确去重
缺点:如果使用机械硬盘的话,flink数据量过大,磁盘会成为性能瓶颈。随之导致整个IO急剧下降。可能会出现背压情况!
发布于:3个月前 (02-06) IP属地:四川省
我来回答
您需要 登录 后回答此问题!