00:00
那么在更新当中,我们要介绍一种特别好用的用法,叫me to,这个与其说是更新,不如说是用来替代join啊,一种高效的join方案啊,Join它其实是怎么做呢?什么叫孟子云兔呢?比如说我有一张表A。对吧?呃,然后呢,我可以用墨子云to语法,我将表这有一张表B,比如说正常来讲我们是要做一个A9IN b啊,这里有点糊对吧?啊,不看这里看这吧啊,如果我们要做一个a ju b这种操作,你可以直接写一个join语法,没问题啊,但是用me云to的话就更舒服了,它会将join的中间这个过程交给护底来做,而不是交给计算引擎啊。那他怎么做的呢?啊,其实什么呢?呃,咱们你看啊merge云to目标表就是A嘛,就是要不要B合并过来啊,然后呢,A就作为目标表,这叫目标表,呃,B呢叫做原表。
01:03
数据来源嘛,我们现在要做的是将B的数据并到A当中去啊,A当中去,那这个时候就是,呃,相当于说把B的数据也写入到A当中去,之后呢,那就写过来了呗,那你可以实现一个就业的效果,就相当于说把它拼接起来啊,拼接起来。那我们看一下这个语法啊,墨子to一个表作为目标表,就是我刚才讲的那个A啊,然后using就是一个原表,就我刚才讲的B,对于这个B你可以写一些circle,一些子查询之类的可以啊,接下来就是什么呢?On,你看出现on了,咱们写join的时候,是不是也要写一个on,对不对,On是一个关联条件是不是啊,那这里就是合并的条件啊,合并的条件。好。那么看啊,来一个具体案例吧,我们先建一张目标表A啊,呃,这张表呢,你看就这么几个字段,然后我也不分区了啊,就简单的指定一个primary key,一个预合并字段啊,一个是ID,一个TS啊,就这么简单啊,不指定表类型,那就是cow呗。
02:18
好。完了插入几条数据呗,啊,你就咱们就正常插,插完查一下看一下。再之后。哎,好了是吧,那就查一下这一张啊,Select新from。嗯,那我们看一下后面的几个字段就好了,哎呀,这样我就不要新了吧,我直接查它的字段,ID name啊,Price啊,TS啊,这样看起来就不用再缩小了呗,啊,那就是现在有了三条数据了,这这是一张表,那接下来我们要呃。
03:05
插入啊,这个是原表啊,当成表B啊,啊,这是S表啊,不是他给他说错了啊,这是原表,就回头要将这张表合并到某一张表当中去啊,那这个A表我们前面就是这个Mo已经有了,对不对啊,就刚才我们在做更新的这张表啊,我们将现在的这三条数据并进来,怎么并呢?你看啊,我将目标表作为target,将原表作为source。啊,其实就起个别名嘛,就是me to一个目标表,Using一个来源表啊就可以了,然后呢,On就是关联条件,诶我要ID相等的关联条件,然后接下来可以写一些问match,问no match对吧,也就是说匹配上的怎么办,没匹配上的要怎么办,那前面这里其实有对吧?啊我这里有讲了一个如果。匹配上的动作咱们要做什么事,是可以做删除啊,更新呢啊都可以,那没匹配上的数据咱们要怎么处理,是插入啊还是怎么样啊,那我们这个案例呢,你看啊,当我匹配上的时候,那我就更新。
04:14
对不对,就更新,那当我没匹配上的时候,我就插入。嗯。先执行一下吧啊。嗯,看一下。这个因为它要涉及到同步have表,那这个还要求我们去启动一个这个have server two啊,Have要连接have serve two,要的话咱们就给他们,那我就起一下啊,No help have杠尬service,或者直接有一个脚本,是不是叫have serve to啊。
05:09
哎。对吧?啊,我直接点杠,Have serve two怎么老不提示我好start。我起一下1万端口呗,啊,你要咱们就给他呗。看一下启动了没有啊。啊,我们有后台启动啊,那行看一下1万端口。啊,少了一个T。好了,现在监听状态了,我们再执行一遍吧,啊执行一遍咱们的梦云two,就是说如果匹配上就更新,没匹配上就插入啊。
06:13
好,这个时候我们再查一下目标表变成啥样了啊,你看我把海serve two启动起来就OK了,对吧?哎,我们来对比一下啊。诶,前面是不是有一个具体字段的呀,啊,我不要前面这些了,这是me s。嗯,咱们查的是这张表,这是sources表对吧?啊,咱们查目标表,那我们跟原始数据对比一下啊,还能不能找到,找不到咱们就回溯呗。啊,时间旅行呗,是不是。看花了都。啊。
07:00
诶,这里吧。啊,现在是这样对不对。这几个字段就好了,后面那几个字段没对比也没事啊,啊,你看这个是这一张目标表,还没梦底之前的样子啊,我们不是把它更新成40了嘛,对吧?好,现在执行的一个孟子云to表B表B的话是这样,我也截个图。我也截个图。往上翻一点啊呃,这个是表壁。好。这就咱们刚才讲的A,这个是B,我们要梦举举云兔进了,那现在的结果是咱们现在这样,那你看啊,嗯。我们当时写法是,如果我们是根据ID去匹配嘛,啊,如果匹配上那就怎么样就更新。
08:00
那如果没匹配上啊,我们就插入,那你看二跟三是不是没匹配上呢,那它是不是就进来了。对吧,啊,那如果是一啊,那一大家发现没变嘛。是吧,为什么没变呢?你看这个TS谁大,咱们是不是1111更大,这个merge s它里面是多少才900对吧,比它小,所以它还是保留原值,呃,那如果咱们要去玩的话,还可以再怎么玩呢?我再插这个梦source,再插入一条数据啊。这个我比一大,我来个2900啊,这样子可以吧。好,那这个时候我们再执行一遍墨这个墨语法,Me to。看看会不会变吧,就ID唯一的能不能被更新掉啊啊不存在的,没匹配上的是已经插入了,那如果存在的呢。
09:07
卡姿。往上翻,我们找目标表啊,看结果,呃,那么这个时候大家再来观察,哎,观察什么呢?这个ID为一的是不是变了呀?是吧,他们呃,就这一条,嗯。这个已经是2900了啊,我们新的一条数据啊,然后跟原先的这两条是不是匹配上了,关联上了,那九引上我们定义的是更新,更新掉是不是啊,那更新他怎么更新呢?就是根据欲合并字段来判断更新成谁的值啊,并不是说你来了说来者是客,你是客人我就从你不是啊,还是要比较这个TS啊预合并字段,那现在2900比111大,那就取这一条数据的值,所以大家看到没有,这就是更新的效果啊,那所以文档这个咱们也稍微改一下吧,方便大家去演示,演示什么呢?我把这个时间图改大一点,改成2900,这样大家一次就能看到效果了啊,这就是墨迹云兔,非常的灵活,那我们可以用墨迹云兔的方式来实现一个类似join的一个更新效果啊,非趁用啊,这个东西啊,在我们实际生产环境有非常重要的一个意义,那赛我写的是新对吧,就表示全更新,你也可以指定为只更新一个字段啊,我写的都是新。
10:28
表示都更新啊行。这个是墨兔的第一个啊,非分区表,这种是非分区表,那么再来个分区表呗,呃,再来第二张表啊,跟前面的没有什么。我看看啊。好,咱们这是一张。那这个就是一张来源表对吧?啊,然后呢,咱们的来源表再准备一些数据之后呢,再孟举到咱们这张表啊,Who d cow有partition的这么一张表啊,这个就前面我们一直操作的这张表啊,Low眼呗啊low这个地方。
11:15
就这一张嘛,啊TB对吧?诶点进来你看是不是有个DT分区,还有个HH分区对不对啊,这是我们前面操作的这张表,好,它是一张分区表啊,然后这是作为目标表,呃,Target啊,然后呢,这一张来源表,我们是只筛选出什么呢123。啊456啊,把这这个几个字段查出来,结果集来合并到这个目标表好,这个target也好,S也好,这个这是表别名啊,你爱怎么起就怎么起啊,然后关联条件呢,还是什么ID啊,接下来是两块,第一块是匹配上。第二块是。呃,匹配上这个可以写过滤条件,你看我这里过滤了,过滤了可以写多个啊,那如果没匹配上怎么办呢?啊怎么这样子,那么挨个看我这边的逻辑啊,第一个如果能根据ID匹配上了,并且呀,我这个。
12:16
Flag不等于删除。大家注意,我flag不等于删除了,也就是说我这个原表里面。我是不是定义了一个字段叫flag对吧?啊,标记为表示三没三,如果不是delete,那么我们就更新ID name啊,TDT对吧?也就将这五个字段就更新掉,那么如果当ID匹配上,并且flag为删除这个时候。我就将数据删掉啊,所以你看我匹配上了,我不仅可以做更新,我还可以把你删掉,对吧,这个语法就特别的灵活了啊呃,那如果没匹配上呢,咱们就进行一个插入就好了啊,就这么简单啊,来好创建这个原表,并且插入数据啊。
13:07
嗯,我现在这个时间,我先查一下这张表目前的状态。呃。啊,也不用啊,不用查了,虽然你的TS都比较小。无所谓。好,这是咱们的原表,我们查一下啊,S select p from这张原表,那么你看看一下,这个是一张PA表,同学们,我using的是pocket,是为了方便,因为如果我建成一张护地表,它前面会拼接五个隐藏字段是不是?那现在方便我直接建成pocket表就不会有隐藏字段啊,那你看呢,它现在有1233条数据啊,然后有一个flag表示我要做什么样的操作啊啊,这是名字啊,那好了,现在我们要把它默举into进来啊,我我也先查一下老的这张表啊啊,现在的新from这张表诶。
14:04
目标表也查一下。呃,就长这样子呗,啊,前面隐藏力我就不看了啊。这是目标表,然后呢,这个是原表。这是原表,这是目标表,好了,接下来咱们来墨匀涂一下啊。等他执行完。好了,执行完之后我们再查一下,哎哎哎,这现在变成了啥样,我把它截个图放大吧啊。要不然太小了,看着不舒服对吧,好。看一下。
15:00
看一下这个也放大,这个也放大。哦,这么放吧,好,这是原来的目标表,这个是原表,这个是M之后的表,那我们的语句是什么呢?语句,恩。往上拿一点吧。那我看一下这个语句是什么意思啊呃。你看通过ID来关联,那你看原表里面ID为一,这里也有一条什么ID为一的,好,那我们定义了,如果匹配上的,那能匹配上的有哪一些呢?啊就。就这AID为一的嘛,那如果flag不等于删除对吧,咱们这条数据是什么呢?Flag为update,它不等于删除,那就执行什么update update操作,那后面我就不再是简单的写一个新浪,它自己根据预合并字段判断了,现在我是手动指定,那你看我ID指定更新为S表的ID啊,Name等于S表的name,那大家可以看到TS等于S的TS。
16:14
啊,DT等于S的DTH等于呃,S的HH,但是大家可以看到我合并完这个name是不是没有变了,你是不是叫new a1啊,但我这边是没变了,为啥呢?为啥呀?因为你看我们这里。呃,这张表SS表原先是没有TS字段的,但是我们是子查询的时候指定TS为固定的1000是不是,那我们知道1000是不是比1111还小啊,所以不好意思,他不会取啊,不会取。所以这个还是要注意这个预合并的问题啊,预合并它的优先级是最高的,所以这边都没变呢,同学们啊,都没变,那在其他的如果flag匹配上,并且flag等于delete,我们这边是没有对吧?啊那就删掉。
17:07
现在没有三啊,又没有这个满足的,接下来没有匹配上的,那么我就将它插入对吧,将它插入,那你看二跟三就是新插入的数据,好吧,这是更复杂一点的用法,也不是更复杂吧,啊,就是更灵活的一个用法。那如果你要看到更新效果,你可以怎么样,你将这个TS把它大于1111就可以,比如说你改成2000啊,你再去执行这个啊就可以啊,这个你可以尽情的玩,这个就是我们的me to啊。
我来说两句