00:00
那么接下来我们来聊一下这个增量查询它是怎么来实现的,其实也很简单,就是依赖于咱们这个timeline还是这个时间轴啊,所以说这个概念很重要,那我们在这个轴上有多个instant对吧,每个instant对应可能是我们一个动作啊,那么。他怎么来实现的?比如说我这时间轴上有多个instant啊,那所谓的增量查询其实很简单,就是我们既然是时间轴,我们就应该能够指定一个时间范围吧啊,所以它我们可以去指定一个叫begin,还可以指定一个end,那所谓的增量查询,比如说我写个T0 t1 T2 T3 T4,我举个例子啊,如果你想增量查询T4以后新增的数据啊,T4之前的那些我不要啊,我不想查,我只想查T4之后有哪些新增的,那简单,你只需要怎么做呢?你将begin指向T4,那end你不指定就行了,表示说结束都要啊,就后面的全都要,这个就是所谓的增量查询那。
01:11
基于此呢,你也可以想一想,那如果我想要查询什么呢?我想要类似前面咱们讲到一个时间旅行,对吧?你是不是可以begin跟end指定为同一个时刻就可以了?对吧,那那也可以实现一个时间旅行啊。那包括后面这个指定时间点查询,其实也是通过控制这两个东西的范围来实现的,好吧,那现在废话少说,我们先来实现一个增量查询。那么我们前面有过两次commit对吧,那我们对这张表还是要重新加载一下啊,我之前就重新加载一下吧,好吧,先加载进来。
02:01
好,加载完之后,我们来获取指定的开始时间啊,那这个你也可以手动指定说具体的某一个time,但是如果你不想指定的话,也可以通过咱们下面这个circle来实现,就什么呢?哎,我order bike meet time。啊,Order by commit,这个commit t就是这个隐隐藏列啊隐藏列,那我们直接对它进行一个distinct啊,去重啊,然后再呢一个排序。之后呢,我再用map算子啊,去get是零啊,然后呢,再TAKE50啊,那当然咱们没有50了。好,先看一眼这个吧。好,那其实大家可以看到我们这个只有两个啊,只有这么两个,好,那既然只有这么两个呢,那接下来,呃,开始的时间。
03:04
那就是看你需要哪一个了啊,这是一个什么呢?一个数组啊,看你要取哪一个,这样来取会比较方便一点,比如说你要从上一个,呃,这个是。比如一共两个对吧,它的索引是零,它的索引是一呀,对吧,所以我这边写法就是索引,我传了一个认识减二,认识减一是最新的这个对不对?N减二就是上一个时刻,也就是说我想要实现一个增量是从上一个时刻开始的啊也可以,哎,那那为了更好的演示这样吧,咱们再插入几次啊,咱们再更新数据,这里不是有一个。诶啊,是上面啊更新数据,这里不是有一个end的方式吗?啊,我们多执行几次就行了呗,啊那我再执行个两次吧,啊好三次吧,来一次。
04:02
呃,再继续。两次。好,再来一次,三次。也就是说,呃,我一共呢,是插入过五次了啊,应该有五个了,你看这里有五个帕回的对吧,每一个版本它都保留下来了,当然有对应的清理策略啊,清理策略行,那既然有这么多,我再执行一下,刚才这个哪一个呢?就是咱们增量查询这里不是,呃,我先重新加载一下啊,再读取这个路径啊,创建为相同的这个表明好了,那之后呢,还是通过对commit time去重,然后排序啊,封装成为一个commit再给大家看一下。
05:00
那大家可以看到这里已经变了对吧,那接下来我就直接指定为上一次啊,上一次啊,也就是说我们现在这里有五次了啊,我指定从上一次这个地方开始增量的查询啊,那我们来试一下呗。那接下来我们就创建这个增量查询的表,怎么创建呢?还是一样read格式维护的,接下来关键是什么?查询类型要改一下,这个查询类型我们更改为叫增量查询啊,这个就固定写法,它封装好的一个常量啊,你就照这么写就行,接下来我们指定一个什么开始时间啊,这个也是一个固定它封装好的一个常量啊,Begin啊,然后呢,帮我们得到了这个begin time传进来。然后呢,就正常去肉的啊,这就OK了呗。然后呢,表明我表明就命名为一个增量表,这个一个表明啊,那接下来不要忘了这个begin time,先获取一下啊begin time好,也就是说获取的是这个什么,呃,52秒。
06:08
23毫秒的这个好,那么接下来就是创建这一张增量表。增量表创建完了,我们来查询这一张增量表,看看它的commit t啊,是不是从我们指定的这个开始时间往后的这些,好吧,好查询那么可以看到,诶来前面我截个图啊,啊,我们的begin time是这个。这个是我们的开始时间啊。好,那我们看到现在能查出来的数据,它的commitm time都是怎么样,是不是都是大于这个时间呢?啊,前面应该都是一样,什么04425啊,那就是这都是56秒的了啊,前面这个分钟都是42啊,一样啊,大家看你执行的时间了,那这个是52秒,然后呢,23毫秒之后的,那么得看到现在就都是了,这个其实就是啊,指定一个时间范围过滤出来,所以它的实现原理特别简单,但往往就是我们说最高端的食材往往只需要最简单的烹饪方式,对吧?啊,这就是一个增量查询啊,很简单啊。
07:26
呃,那么其实大家也可以看到,我们每一次数据变更都重新加载,是为啥呢?因为咱们基于这种Spark渲染,它纯粹就是一种什么批处理啊,对吧,我们不是实时的流处理啊。所以呢,利用增量查询,我们能够在批处理的数据上创建啊流逝的这种管道效果,我举个例子,呃,咱们比如说用Spark写的,我可以是不是可以设置每五分钟调度一次,也就是说每五分钟执行一次代码,那这个时候你是不是可以每五分钟通过不写死开始时间,每一次获取的是不是都不一样。
08:05
对吧,这样就可以实现一个,诶五分钟,我只拿到这五分钟的增量数据啊,对不对,就看起来像是一个流逝的效果,这是通过Spark来做,这么来一个实现啊,好,另外我们一起看一下这个指定时间点吧,所谓的指定时间点是什么意思呢?就是我现在有多次,呃。commit。呃,多个instant,那比如说你指定到你要指定的是这一段时间啊,它的一个状态就好了啊。最新的一次我不要这个就是指定时间点,那怎么实现呢?其实就是什么,将begin设置为最开始的地方,将end设置为指定的这个派,那这样就可以获取这一段时间的一个。一个状态和数据了,对不对,嗯。
09:01
这个跟时间旅行前面讲的那个什么as off那个还是有点区别的啊,咱们来试一下吧,好,那你看我怎么做啊啊,我将开始时间指定为000,表示最开始,然后N的time呢,我指定为上一次,对吧?这个写法我们前面闹过了啊,跟跟跟前面那个是一样,好先获取这两个,也就是说我指定的范围了,指定完范围之后,我们创建一张表啊,叫时间点查询,一样的格式为护底啊,咱们去read一下,然后查询类型还是一样,还是这种增量查询啊,增量查询就可以指定begin跟end啊,这是固定写法啊,然后把咱们获取到了两个时间传进来,这个是000,这个是上一次啊,也就是说还是这个啊,从最开始一直到上一次啊,然后呢,创建了这个表明啊,然后再进行一个查询,很简单吧,啊,所以你把他的思想本质理解了就可以了,来直接粘贴执行,然。
10:01
后呢来查,那么大家可以看到这个commit time有哪一些啊,哎,你看有,呃,这个52秒的,023的啊,有47秒的。有52秒的,有57秒的啊,当然这个57是时间更早的,对吧。啊,时间更早了啊,我看一下啊,别别别看差了啊嗯。零四啊,这个是分钟啊,这个是分钟啊,你看有十分的啊,42分的这几个都有啊。嗯,这样吧,我把这个截一下吧。这些是不是通通都小于42分52秒023呢,23毫秒对吧?啊,那这个是。结束时间的这个时刻啊,那剩下的这些都是比他小,比他早的对不对啊,有这么四次提交的时间,我们能明显看到啊,这个就是指定的,那接下来可能大家会跟那个时间旅行搞混。
11:11
啊,可能会搞混,呃,我刚才是不是创建了一张时间旅行的这个表,对不对啊,这是其中一个,这是应该是我们第一次commit啊,嗯,那这样吧,我来一个第二次的。啊,或者说也是第四次吧,我我我按照这个时间来。啊,我再创建一次,这个看它们有什么区别啊,诶这个是我们提交呃,插入五次当中的第四次对不对,我们看看跟指定时间点这个有什么区别啊,那这个东西呢,咱们还是直接这么去创建就可以了啊。直接这么来创点好。好,创建完之后,我执行相同的查询啊,就commit这个查询。
12:05
呃,然后表名改一下啊呃。哎哟,我去这个表明还不太一样啊,这个叫snapper shot2啊。跟表明对应起来啊,其他的跟刚才的这个时间点查询保持一致,哎,我看一下。那大家可以看到也同样是123456788条啊,上面应该也是123456788条,所以大家看到了这种写法跟我们刚才的指定时间点,呃,我从000开始一直到指定的一个time啊,是不是一样的效果啊,所以其实说白了,这个时间旅行查询跟这种指定时间点,呃,其实咱们理解起来是一样啊,只要你的开始时间是000,然后end指定为某个点,这个就等价于as of instant啊一个时间点。
13:07
一个意思啊,一个意思,嗯,行。这个是咱们这个事儿啊。
我来说两句