内容纲要
背景
消除重复数据是非常重要的功能。实时计算中的去重由于实时计算的特性,是一个增量的长期的过程,并且由于实时数据流是有状态的,所以在不同的场景下,去重的方案也不一样。
窗口去重(短时间去重):
窗口去重基于group by的集合器内去重,该场景将窗口内的所有key存入Hashmap,通过Hashmap的key的union特性来实现去重。
通过Hashmap去重的问题是,只能做到窗口去重,没办法基于全量数据做去重。
使用方法如下:
select count(distinct id), sum(price) from orders group by product_id;
全量数据有状态去重(长时间去重):
目前方案是所有key存在hbase,通过hbase查询(或glk join)来判断是否存在重复的数据。这种方案引入了中间kafka以及hbase,将一个场景拆分成多个任务,整体较为冗余。
对流入的数据流进行去重得到一个无重复数据的数据流,然后基于衍生数据流的来进行下一步处理。
使用方法如下:
INSERT INTO {target table}
SELECT *
FROM {source table}
DISTINCT BY {source distinct column}
ON {distinct table}.{distinct column};
关于窗口函数与distinct
slipstream支持窗口函数ROW_NUMBER()的查询,但是在流任务中不支持。distinct在老版本的使用上存在一些bug。对于流中出现的这两种语法,需要特别关注一下。