00:00
那接下来我们看一个合并数家族的一个常用的一个引擎,Replacing merate,其实看名字你就知道它会干嘛,Replace的一个单词,对吧,是不是一个替换呢,对吧?它是medurate的一个变种,它其他的都跟这个merate,就咱们前面聊的一样,但多了一个什么去虫。那有同学想,哎,有了巨虫了,省事了,方便了,那你想的太美了,对吧?呃,那咱们先聊一聊啊。尽管咱们是不是有个primary key啊,但前面讲了他没有唯一约束对吧?所以大家想想他去重会根据组件去重吗?并不会啊,不会,而是什么呢?它是根据什么,Order by。它是根据咱们order by的字段去重的啊order by。那么。接下来我们看一下它的几个注意事项啊,第一个驱虫的时机,它是实时驱虫的吗?并不是啊,这点大家要注意,它只有在合并的过程中才会去重,也就是说我现在插入了重复的数据啊,就欧B字段是重复的,我又想去重,那这个时候。
01:15
我能直接查,就代表说是结果一定去除了吗?并不是啊,他得等合并,那合并什么时候合并你知道吗?你是不知道吗?他是在未知的时间之后,在后台去做一个合并操作的,那这个时候你怎么办呢?生产环境你得考虑这个问题。我用这个引擎,我就是想去虫啊。我就是想驱虫,结果你告诉我,我查出来的数据还不一定是去完虫的。那问题就大了。对吧,那你结果你给老板看对吧,比如说你计算一个呃,成交额正常每天是1000万,结果你重复数据一多,对吧,结果你算成了一个亿,那老板不得高兴的疯了对吧,老板疯了啊,疯了发财了啊,那如果你算少的呢,也不行呗,对吧,1000万你算成1万。
02:11
那老板是不是连夜扛着火车就跑了呀,对吧?啊,所以咱们。特别是实时的场景,对于这种一致性,数据的一致性是很讲究的啊,那么关于这一块,咱们在高级部分在介绍要有什么方案来处理它啊,那这边他只能保证什么最终的一致性,大家注意它的一致性是什么,最终也就是说最后啊,它经过合并之后是去完重的啊,最终的,但咱们还是有其他方案的啊,回头再聊啊,那另外一个去重的范围。如果咱们经过了分区,它不会跨分区去重啊,因为你想想咱们分区是不是在不同的目录下面,那它如果不同目录之间也要去重的话,那你分区的意义。就不大了,对吧,他仍要全表扫描是不是这个意思啊,所以它只是分区内去重啊分区内呃。
03:06
综上呢,它不能保证没有重复数据出现,就刚才讲的只能保证最终的一致性,那其实解决方案呢,大概有三种对吧,高级高级部分咱们详聊。来,我们先创建一张表啊,那我们看看来。这张表咱们order by是不是两个字呢?附件呢,只有ID。那我们指定的引擎指定为什么replacing me,那里面可以传一个参数啊,大家注意,你想想它去重得有个依据呗,就这么多条,我保留哪一条啊。你有同学说不去重吗?那完全一样,不是啊,我们指定的是两个字,你看order by的字段去重啊,那我有没有可能ID是一,呃,SQID是1001,另一条也是11001,但是后面其他字段的值是不一样的。
04:04
对吧,那你到底把哪条删掉啊,你是不是得有个依据啊,那我们传的字段。就是依据它会以这个指定字段值最大的当成保留下来的数据,那么只比它小的就是。要被删除的数据,也就是说没用的数据啊,那你不指定也行,不指定他按照你插入的顺序来,谁最后插入的就保留谁啊。很简单啊。相当于说这做了一个什么版本控制呗,像h base它怎么来判断新数据啊,是不是按照时间戳也是它的标志啊?但问题就在于,H base即使他没有执行大合并,但你查出来是不是也是最新的那一条啊,因为他自己会做判断。对吧,查的时候它相当于自动加了一个过滤条件,但我们click house没有。我们先建表吧,呃,建这张表好,那我们按照create。
05:07
来,我们按照create太做一个版本标识对吧?好,那我们查数据。好,我们查一下这张表,From order,呃,应该是it呗,对吧,好,你看。有没有重复数据呢?哦,这个刚好碰到他什么,碰到它那个已经合并完了,已经合并完了啊,那这还比较。麻烦那那也没必要我再插入一遍行不行,我再插入一遍啊,因为刚好碰到他合并完了啊,那再插一遍你看啊。呃。
06:02
这个是不是还未合并呢?呃。这个是不是一个重复数据呢?对吧,这是一个重复数据对吧,那这个也算是一个重复数据。那我们来看看啊,它能不能合并。你看我重复插入了两次,但数据量为什么会少?因为新版本你在每一批次插入的过程中,它会分区内去一次重,所以虽然我们一次性你看插几条啊,123456,一次性插六条,但每次其实只有四条,对吧?因为他在一批次插入的时候帮你去了一次虫,但是我后面又执行了一次插入。他并没有屈从。那这个时候你想想咋办呢?这样是不是还有重复数据啊,那肯定不合适对吧,那我们可以怎么样呢。
07:02
手动执行合并呗。这个是RT啊。好,接下来再查一遍这条数据,你看。原来是这样。那现在是是不是经过了处理啊,对吧,那还有一个问题就是,虽然我们第一次插入的时候这么多条,它自动帮我们合并了一次,我们看一下啊呃,我们找最初的那一次啊,最初的这一次。你看102SKU002,其实我这边是放了好多条。啊,不是同分区的,是不是这个这三条啊,那你看一开始它是不是只保留了一万二这一条,为什么呢?因为咱们是不是指定了一个版本标识是什么time。
08:00
对不对,那好啊,你这个11点肯定比这个这几个13点的小,那你肯定是被抛弃的,没问题,那问题在于这两条时间一样。凭什么你保留一万二的这一条,我们说了如果标识字段一样,它会怎么样比较插入的先后顺序,那咱们一万二是不是后面插入的,所以他当时自动合并的这个过程,它保留了一万二这一条。那后面我们又插入了一次对吧?呃,有一些同步数据,并且最终我们手动执行合并,帮我们去完成了,还是这个结果对吧?那这个结果大家想一想,难道这个不算是重复数据吗?原因在哪呢?哎,对,是不是因为分区不一样对吧,从这咱们也可以看到它是分区内部进行去重了啊,这个大家可以玩一玩,如果是老一点的版本,你在首次插入的时候,第一次插入六条,你查出来它就是六条。
09:07
也就是说它第一次并不会帮你自动合并啊,那新版呢,咱们是21.7的对吧?啊,比较新的版本,它对这一块又做了一些处理,尽量就是说一开始就帮你处理掉对吧,你要不信你再插一次呗。你再查一次,他这次还是只多了那个四条。你看嘛,跟原来比,是不是还是只多了四条啊?对吧,他在你插入的那个时候帮你做了一次驱虫啊,这是新版本才有的,老版本没有啊。至少在二零年的版本是不会的。行,那你再玩一玩,就是再手动合并一次,再查一下又好了啊。这是咱们的一个替换啊替换。
10:02
所以呢,这个会去虫的合并数呢,咱们可以知道这么几个结论对吧。实际上它使用order by的字段作为一个唯一约束啊,并不是组件另外一个驱虫,它只是分区内的驱虫啊。第三一个。还特别要注意的是有合并分区。才会进行去重,其实咱们应该再加上一条,什么意思呢?只有呃,同一批插入及。或合并分区时才会进行驱动,对吧?像咱们刚才是演的,当然这个同一批插入,这个是什么新版本才会有啊,新版本同位P插入在新版本里面,它会帮你分区内驱重,还有另外一个就是合并分区的时候啊会驱重,那么。那我们重复的数据的保留规则呢,是咱们指定的那个版本字段值最大的,一般咱们通常会用一个什么时间字段啊,通常会用时间字段,你也可以不指定,不指定呢,或者版本字段它值相同怎么办呢?按照一个插入顺序保留最后一笔啊。
11:15
这是咱们关于这个呃,Replacingdurate的一个总结和梳理,这是一个结论啊,要记住啊,因为为什么呢?因为这个点,这个引擎是咱们很常用的一个引擎,那他的一些注意事项啊,说白了,你记住对你只有好处啊,只有好处。
我来说两句