问题描述:maxwell进行bootstrap数据采集的时候,发现同时采集到了insert数据,如何进行数据去重?
分三步完成:
你直接插入历史数据到表里
然后从表里查询出最小的ts
然后插入今天采集当天采集到的ts之后得增量数据
==========第一步=========
insert overwrite table dwd_table_inc partition (dt='2023-02-19')
SELECT
ts,
id,
name
from ods_table_inc
where dt = '2023-02-19' and type = 'bootstrap-insert';
=====================第三步
insert overwrite table dwd_table_inc partition (dt='2023-02-19')
SELECT
ts,
id,
name
from ods_table_inc
where dt = '2023-02-19' and type = 'insert'
and ts >= (
===========第二步==============
select min(t2)
from dwd_table_inc
)
你可以想象一下拍照记录,当你按下相机后,已经决定了你记录了什么。
问:然后呢?
照片在洗出来的时间里,外面的环境还在变化,你要知道整个变化过程,就得记录这段时间的增量变化,而照片,则记录了之前到你按下快门之前的所有变化的累计,其实就是一个时间点,然后向后累加,但由于查询的性能问题,导致这和时间点完成的事需要一定时间才能完成。
问:那重复的地方在哪?
重复的地方就是你之前在拍照之前记录的东西,那些是多余的,如果你把他累加到拍照之后,就会产生重复
问:你的意思是按快门的时间就是最小的bootstrap_ts?要求insert_ts大于等于min(bootstrap_ts),这就是按完快门的时间
是的
问:我们之前不是说,在进行boostrap时,这个时候,插入了数据,下次同步的时候,插入的数据就会变成历史数据,那这个怎么去理解?
因为你bootstrap了两次,拍了两次照片啊,那之前的不就成了第二次的历史吗?
问:但是我们只做了一次bootstrap,对吗?
是的,我们只需要做一次就行了
问:什么情况下,会出现insert_ts 会小于min(bootstrap_ts)? 我采集到的insert最早的数据是8:30,而bootstrap开始时间是10:00
bootstrap要在maxwell开启之后进行,你的maxwell啥时候开的?
问:我一直把maxwell开了,而且没有清空maxwell数据库
那他就一直在增量采集数据
问:怪不得我老师说,清空maxwell数据库就不会有重复数据
这个是没办法避免的
问:啥意思?
因为你需要先开启maxwell才能进行bootstrap同步
问:清空了数据库,还会有重复数据?
和这个没关系
问:你的意思是maxwell采集增量数据在前,bootstrap在后,是吗?
是的,就是两个线程
问:我卡住的点在于没有理解maxwell的bootstrap,意思就是bootstrap只能同步数据库一开始的状态,后面即使在同步的中途,这个数据库发生了变化,它无法捕捉到变化的数据,是这个意思吗?变化的数据需要maxwell增量采集
是的
顺便查询一下小于这个1ms的有没有存在:bootstrap的最小ts和小于改值1ms的insert数据,bootstrap的最小ts和小于改值1ms的insert数据