00:00
好,那首先呢,第一步啊,我们要做这个获取数据并解析,方便主流操作啊,那我们要对这个value解析成table process,那么有一个前提,我们得知道这个value到底长什么样子才可以。对吧,好,那这个是广播流读来的数据,那广播流是我们这个MY。就是弗CDC读过来数据,所以呢,它的格式很简单,我们呢这样把这个拿过来对吧。然后呢,我写一个test对吧,在这边写一个test。好,我们取一下它的格式OK吧,好,那这边呢,Com点硅谷点CDC test对吧。啊,就跟Excel一样,我们都要先拿到这个数据格式。啊,你没有格式,你没办法加工对吧,你也不知道这个字段可叫什么Y这叫什么,因为它封装是一个阶算格式对吧,所以我们要拿到这个字段啊,啊麦妈网这里边呢,我们就不写注释了啊。
01:14
得到一个烟味。还是这一个边路,然后呢,把这个拿过来啊,然后这个理由我们做一个打印啊。启动好,那我们直接运行。我们先要拿到这个数据格式对吧。嗯,咱用的是初始化啊,我们稍微等一会儿,诶这个就有了,对吧,把它拿过来啊。好,当然你再去新增也可以,我们有一条数据就够了,对吧,把这个拿过来啊。
02:01
这是我们CDC的格式,我也给这儿来一份对吧。嗯,这边数据格式,哎,往这一放可以吧,好,那这个东西呢,我们在这也放一份啊,这个是value写一个注释对吧?Value然后呢,放在这。啊,那这样的话,我们才能知道怎么去做解析,对吧,你要解析数据,你肯定得知道你数据长什么样子,你才能解析,你不知道长什么样子,你解析啥呀,对吧?好,那我们要把一个内容解析成这个。Table process比较,那你告诉我这里边儿哪个字段解析成table process。哪个字段。
03:05
对了,很明显。是不是这个after啊,就是把这个东西解析成table process对象吧,其实我们要的不就这一行数据吗?其他的什么表明啊,这些库名啊都没有用,对吧?因为我读的限定死了,就是这个表明库名,那他肯定酷是他表呢。表在a table呢?好在这肯定是它呀,因为我们读的就是它对吧?啊,所以呢,我们要的就是把这个after把它解析成table process对吧?好,那第一步啊,这里边第一件事情获取并解析数据对吧?好,那首先呢,我们这个是spring不好处理,先呢,把这个整个的整个的变成一个阶层object,然后接下来把大的注意啊,大的这个阶层object里边呢。
04:01
After解析成table process对吧?那还是一样的,杰森点pass object,呃,从这里边去获取three,获取谁呢?After,然后呢,Table process点二单位,那我们就得到了一个table process对象,对吧?第一件事。搞定啊,注意啊,那你能这样写这个前提,如果说我不把这玩意粘过来,有多少同学知道还记得是阿。如果我不拿这个数据格式,有多少同学还记得这个数据的样式,长这样子是不记得呀,不好吧,所以你在处理任何数据的时候,你一定要知道你处理的这个数据它长什么样子。你才能动手处理对吧,要不然处理不了,好这个搞定啊截掉。好,那咱们的数据呢,已经是table process了,那第二校验并见表,第二校验并见表。
05:01
对吧,那我们叫check table。好,这个方法呢,没有等会儿我们去创建这个无所谓啊,呃,那我们想。校验并见表对吧?那我们要传什么字段?穿什么字段?就是我们要完成这个建表工作,传什么字段来看啊,是不是这四个。没问题吧?表明。字段名。主见。扩展字段。没问题吧,就是我们要将这四个字段传进去见表对吧,好,那在这。Table点。叫get s table诶表明要有对吧,啊然后呢,Get s columns啊字段。
06:00
主见。加扩展字段,这几个字段就是给建表用的,对吧,那当然要弹进去做建表好,那这边呢,Alt加回车,让他自己创建一个方法在这。对吧,这边呢,我们叫什么校验并见表。好,我把这个稍微写一下,这个当然大家都比较清楚啊,当然我写一下分表扩展知道对吧?好这几个东西,然后呢,在这里边我们要写这个介表,介表语句啊,那这个介表语句呢,长什么样子,我们可以在这写一下,对吧?那接表语句呢,应该是create table,呃,Create table,然后呢,我们加if not exist吧。
07:06
然后呢,表明表明呢,我们之前说了,我们要操作另外的库,所以呢应该是DB。点。TN对吧,好括号,然后AA啊,那我也不知道什么类型,那而里边呢,它都会做这个。处理处理成二进制对吧,所以呢,我们都用这个我差就是思令类型就好了,对吧,但是在这个里面呢,它都是我差好比如说这个AA啊啊啊,假如说ID啊,对吧,比如说它是我们的主件,那我们要写的是primary。T,对吧,逗号好,那第二个BB字段啊,BB字段呢是what?啊,它不是主键,那就这样写好,第三个CC也是这个,那最后呢,扩展字段。这样吧,好,咱们的接表语句呢,就这这。啊,咱们的建表语句就长这样对吧,那我们要做的事情就是拼接。
08:06
这个界面语句。啊拼接,然后呢去执行执行好,那这个里边呢,要到非离间表,那间表的话要不要连接啊。对吧,好,那我问大家,既然要连接,那我是在这儿创建连接吗?因为我们没有连接啊,对吧,我是不是应该在这儿。去创建连接呢。
09:00
如果说我们要创建链接,你觉得应该放在哪比较合适?啊,在这儿创建链接,来一条数据就创建一次,然后你还得释放,太浪费资源了,那你告诉我应该在哪去创建连接。大家觉得应该在哪?创建连接比较合适。对吧,我们准备工作要做,因为接下来呢,我们就拼接circle,用连接去编译这个circle,然后执行,对吧。就做这个事情,那我们连接应该放哪呢?啊,在这,那就来一条数据创建一次。对吧,其实也还好,因为我们是配置信息,它不是主流信息,对吧,其实也还好啊,那如果说我们考虑到不想他来一条就创建一个,来一条创建一个,那我们是不是可以写在像牛总所说对吧,写在open方法里边。
10:12
可不可以啊,对吧啊,除了open方法里边,Open方法里边有什么好处啊,就是一个并度共用一个连接。对吧,在open方法里面写,那就一个并行度。共用一个连接,好,呃,那除了open方法里边还可以怎么做?我们还可以怎么做?是不是我们静态代码块,那你不如open了对吧,你啊不如open了,那这个差不多对吧。我们是不是既然你是JDBC,我们是不是也可以通过这个德鲁一构建一个。连接池。是不是这块东西都忘完了?啊,但是没关系,我们呢,你看啊,这个地方要求见表吧,然后未来呢,这是不是要将数据写到PHOENIX2个两种方式都给大家写一下可以吧?啊那这一块呢,我们先选简单的先用open,好在我们的open方法里边创建。
11:18
连接OK吧,后面这个位置啊,将数据写出到Phoenix啊,到时候呢,咱们。在这个。使用连接池去构建好对吧,用德鲁伊啊,那正好大家利用周日呢,可以稍微回顾一下啊,因为前面学习my circle JD VC的时候是讲过德鲁伊连接池的,对吧?啊稍微的回顾一下啊,因为这块Java代码。操作的会比较更多一些啊,而关于那个Li可能嗯,没那么多了,就是关于这两个方法的处理,对吧,更多的是Java,所以呢,我希望大家能够利用周日的时候稍微的去看一看。
12:03
啊,那么这块呢,我就给大家写到open里边对吧?好,那写到open里边,呃,初始化写在open里边,但是呢,声明是不是写在外面,因为我要在这儿用对吧,所以呢,我们准备啊这边呢。Private connection。啊,申明一个这个连接啊,然后呢,在open方法里边初始化这个连接,那就connection。然后呢,这边写driver manager.get connection,呃,这是Phoenix对吧?Phoenix呢,我们并不需要写user name跟password,它没有对吧,我只需要一个URL就够了,好,那这个东西呢,来我们在这啊。我这放了一个常量。嗯,获取连接常量应该在我看一下常量,因为这个它他不让我们写更小的标题了,所以有的东西呢,我得去拿一下啊,它的一个常量啊,在这儿定一个常量对吧,我们拿过来啊,但是大家呢,你就不用,你就拿我的代码就好了。
13:09
这边呢,我们放一个常量类啊,这个常量里边我放什么东西呢?放三个东西啊。呃,第一个我们的库明,第二个驱动啊,当前我们那个并不需要驱动啊,那后面我们通过德鲁伊构建。连接池的时候,我们会用到驱动,现在呢,不用你先不用管啊,那还有一个是连接的地址URL对吧?好,这个库名呢,我改一下啊,呃,咱们叫这个211126啊,每个班呢我改一下对吧,因为文档当中呢,我就还是统一命名,然后呢,在每个班我就改成一个班级号OK了,好。呃,那我们的常量有了,接下来这边要一个URL,那咱们呢,就是g more con.phoenix so,对吧,好,这个有了,那咱们的连接就说实话了啊,当然这个连接你要想关,你得在哪关。
14:17
如果你想关,是不是应该在这儿?大家告诉我对不对?是不是应该在的方法里边关啊,对吧,当然我们作为一个理,你不关这个大家不写可不可以。其实也可以。对吧,啊,你不要在这里边就关哦,这不能关,因为一个边路只有这么一个连接,你处理一条数据之后,你给它关掉了,你其他人用不了了,对吧?好,那连接有了,那这里边我们要做的事情呢,就是拼接circle口,然后呢,编译circle啊编译操考对吧?然后执行操考,执行操考见表,我们做的不就这个事吗。
15:00
对吧,好呃,但是拼接三个之前呢,有个设计需要跟大家说明一下,因为这个东西啊,还有这个东西有可能是这个样子,什么样子呢?来看啊,我们添加一条数据。嗯。再改一下。好两个空着,呃,有可能呢,这两个没写没写呢,它获取到的值就是那那那就有问题。对吧,那问题很大啊,所以呢,关于这两个字段,我们做一个处理啊。这个是简单处理一下处理,嗯,特殊字段,因为特别是最后一个字段啊,这个字段,因为我一个建表语句,我没有这个扩展字段,那太正常了。对吧,那没有你就为捺,那我拼接搜狗,你可以拼接一个空没问题,对吧,你拼接个捺,那它就会报错。
16:01
啊对吧,拼接now最后编译的时候它就会有问题,所以呢,像这种我们要处理一下啊好,那这边。C和PK等等于呢?或者它等于空,那这个都不行,没有主见。对吧,没有主件不行,那我们给个什么呢?呃,因为我们是维表啊,我们这个地方做维表,所以呢,如果你不给,那我统一都叫ID,我呢ID作为我们的主件,因为其实你可以发现未来在工作时候也一样,呃,一般来说对于这种为表啊,我们组件就是买三里的组件都会叫ID。啊,就是不叫ID的特别少。啊,所以呢,当你不写,你最好一般都要写对吧?如果你没写,我就认为是ID,如果你没有,他就会报错误,好,OK,我就给个默认值,好,好,那接下来这个字段它有可能为空,对吧,为no,好,那我们也处理一下if think extend,它如果等等于那。
17:09
那你要拼接个闹,那不行,对吧,我宁愿拼接个什么你都没给,那我就给你个空,对吧,我最后做字符串拼接,我拼接个空它不会出问题,你要拼接个浪,然后它就编译出问题了。对吧,啊,那肯定不行啊,那肯定是不行的,所以呢,咱们呢,写一个空啊要空,接下来我们要拼接circle,也就是说最终我们要得到这个样子。样式。我拿到这。对吧,好。那我们怎么拼接呢?首先我们用一个build或者B对吧。好,然后这边我们把能写的写一写。到这注意字符串拼接,这空格一定要加。
18:05
一定要加这个空格啊,你别不加这个空格点。追加什么DBDB呢,在这数据库名称对吧,叫ISTEM啊,那好,那从JA末个点STEM继续判点。对吧,注意。点啊,不要漏了啊,继续end,这个地方呢叫T表明对吧,表明呢咱们是think table啊think table。好,然后这个地方括号我是不是能够拼接上啊。左括号,那接下来这个东西。不行了,你在这儿没法写了,你得根据这个来,对吧,得根据thinks这个东西来看R化加位啊得到一个。So,狗交。界标语句,Create。
19:01
Table circle对吧,建表语句的一个circle啊,这个东西啊,但是呢,随便build我们还可以继续拼接,那接下来我们要做的就是拼接字段看。这个字段拼接有讲究,什么讲究呢?看啊,如果它是主键,它要加一个primary key,而且还有一个问题,只要你不是最后一个字段。都要加逗号,看见没?最后一个字段不需要加逗号。对吧,这种细节一定要注意一下啊,所以呢,咱们要判断。它是不是最后一个字段,还要判断它是不是主线啊,那我们先把这个做一个切分啊,点私立的,比如说我们规定按逗号分割啊,好CTRL加V得到一个columns。啊,接下来呢,我们做一个处理啊,用for I循环,注意因为我们要知道它是不是最后一个,所以用for I循环最好,然后呢,这个地方是columns.less对吧?然后这里边取出字段活计酸,呃,那就columns。
20:14
哎,得到一个。对吧,得到卡好第二判断。是否为主键?呃,这边if think pk.equals咱们的column对吧,好,Else。这是两种,两种情况,如果是主键,那我们拼接什么,继续把判对吧,是主键我们追加当前的column啊,再继续拼接,注意空格。因为这个地方有个卡对吧,它前面呢是括号,或者说前面是逗号,那你前面可以不用不用加空格,如果你不放心,你最好呢,在这儿也搞一个什么。
21:08
空格啊,其实这个空格呢,可以不写,因为它前面这个字段名前面要不然是逗号,要不然呢是这个括号对吧,只有两种可能性,那括号。或者逗号,所以呢,前面可以不加,但是这一定要加啊,这后面呢。你要加空格也可以,你不加也没事儿,不加也没事,因为这个后面它要不然是逗号,要不然是括号对吧,所以可以不加啊好,那这个搞定,如果你不是主键字段,那你拼接的是什么。知道摩差就够了。不要这个主线。没问题吧,好,那这个空格还是有啊,这种细节一定要注意一下啊,接下来判断是否是最后一个字段。啊,判断是否为最后一个字段。
22:04
对吧,呃,那。我们怎么做呢,If?当前的这个I。对吧,啊,哎。小于。Columns gets。减一啊,因为它最大是等于它减一,因为这循环条件是A小于它的长度对吧,所以最大取值应该是它的减一,如果它等于减一说明是最后一个,那小于减一说明不是最后一个,只要你不是最后一个,我都要拼接一个逗号对吧?好,那在这。点加一个逗号没问题吧,啊这块就是这种拼接字符转的时候一定要注意一下它的一个细节,好,那我们整个的负循环结束说明。
23:03
我们字段已经结束了,已经到这儿了。对吧,后面剩一个右半边括号加扩展字段,好,那这就很简单了啊create.a注意加上一个右半边括号,再拼接一个什么。Single对吧,把这个扩展字段拼上去。好,那我们建表语句就搞定了。啊,建表语句就搞定了啊呃。不是有主键字段吗?直接拿SPK字段放最后。前面都拼逗号不是也行吗?呃,不行。不行,我懂你的意思,就是你便利的时候疯狂写这玩意儿对吧,都加逗号,然后在外面啊,你你这个里边你在外面对吧,我懂你的意思,你这样呢,拼接什么吧,叫think TK啊,然后呢在end。
24:10
就是里边呢。你是不是这个意思,就是里边呢,都写这个东西加逗号。对吧,最后我再拼接这个是这意思吗?就是里边我不做判断,我直接疯狂写这个,写这样的方式,但是里边我写它。你是这意思吗?啊,嗯,不能这样写啊,你要这样写的话,你得干一个什么事呢?你你还是得判断。你得判断,你得判断你你取个反。取反对吧,如果你直接这样写,那就会报错,那你直接这样写,你的ID是不是用了两次?对不对。你告诉我你的ID是不是会用两次啊?
25:00
你循环的时候用了一次ID,然后这用了一次ID,当然你这方式可行啊,但是呢,你得去反取出来非主键字段,直接加逗号,最后拼接主键字段是不是也可以。对吧,但是你少说了一步吧,啊,这种方式可以啊,但是呢,按照你所说的就不行。你得在这个循环里边得判断它不是主键。才可以OK吗?你里边都不是主键,最后再拼接一个主键。就是如果你里边不判断,那就不行。能理解吧?啊好,这个呢,呃,那咱们呢,写的字符串拼接也不太确定它有没有问题对吧,所以呢,在编译收割之前呢,咱们做一个打印啊把这个打印一下。这个是建表语句对吧。好,那接下来呢,编译编译呢,就拿到我们刚才连接啊,点three t statement,然后呢,把这个so传进去,好,它有异常,那等会呢,我们统一来处理,对吧,我们要考虑这个异常应该怎么办,对吧?先呢,我们先不管啊,这个有异常。
26:25
交于异常对吧?呃,四个异常好,那我们先不管,那我们这编译好了,正常编译完之后呢,应该要这个是预编译啊,对吧?然后呢,我们要给问号赋值,但是我们所有的字段都已经给定了,所以呢也没有什么问号了,对吧,就直接拿来用,然后呢,执行,那就prepare statement.x去执行之后呢,我们要释放资源对吧,那就是这个prepare statement.close诶把它呢去关掉啊,那连接不能关啊。对吧,之前我们强调的连接,你要想关,你得写到close方法里边,你不能在这儿去关好,那不行,对吧,好,那这个东西搞定,接下来呢,我们就处理这个异常。
27:08
那这个异常怎么办呢?我们思考一下。啊,那。这个异常。如果发生了。那就代表我们这个表呢,就不会建成功。对吧,那大家告诉我这个异常发生了,我是把它catch住就处理掉。就正常过去还是说应该把程序停了。就是你建表失败了,是应该。把这个异常捕获到。然后呢?处理好好的处理掉。让程序继续运行。还是说我直接让程序停掉。
28:01
我应该选择哪种方案?第一个继续还是第二个停止?咱们应该是继续还是应该停止啊,告诉我。这个地方肯定要停掉。对不对,停掉,为什么?因为你建表都失败了,你接下来主流数据来了。你往这张表里边写,他有吗?你都没有表。你写什么,也就是说你这边建表失败,那未来我在这儿往外写,那必然会失败,你都没有表,你写什么,所以这个异常我们发现它应该把程序停掉好,那停掉的方式,最好的方式就不处理了,那不处理它就停掉,但是呢,它又是一个什么?
29:00
编译是异常,你不处理还不行。对吧,但是要是运行时一条我就可以不处理了,对吧,反正你抛出来任务会停掉,我就不管对吧,但是现在呢,它是一个编译式一条。你不处理不行。你必须要处理,那这种方式怎么做呢?来看啊,咱们这样。我就多包裹一点,我就从上到下对吧,到这儿。Control out,加key,我干什么事呢?Try catch。对吧,或者说呢,你加一个try finally,因为我们可以把这个关闭连接写到finally里边。对吧,好。呃,那关闭连接,我要写到。释放资源要写到这个位置,它会报错,因为他获取不到,所以关于他的声明我怎么样,我得给他写出去吧。写到这个串空间的外面。啊,那他的一个声明要写在外面,好,那我们先把这个处理完,对吧,这边释放资源,咱们应该这么写if。
30:11
好,这样处理一下。对吧,呃,那。接下来。这个。改成这样对吧,那我们怎么能让程序停掉呢?你告诉我。嗯。那这样处理,如果说发生异常了,这个程序会停吗?如果现在这样处理,这个程序会不会停?大家告诉我。他会不会停啊。他根本就不会停,因为你已经catch住了。对吧,那现在我要求这个程序停,我应该怎么做。
31:07
我应该。怎么做?啊,如果说发生异常了,我希望这个程序停掉,我应该怎么做?对吧,刚才我们看到的异常是一个编译式异常,你不处理不行,我们本来想着只要发生这个异常,我就让它挂掉,那我就不处理挺好的,对吧,但是无奈他是一个编译,是一条你不处理不行,那逼着你处理,你不处理那报错,你运行不了。啊,搞一个运行11条,对了啊,就是我们遇到这种问题的时候,我们要画这个什么。编译是一条为运行是一条就好了,好,那怎么做呢?在这个地方不打印这个站信息,对吧,我们直接手动思肉又一个叫wrong except,哎,我把它变成运行力量,说见表时代啊,如果说你想。
32:19
打印哪张表对吧,哪张表呢?建表失败啊,得加一个表明think table。啊,你要知道哪张表建表失败了,然后在网上找我们打印了有建表语句,你看一下是不是接表语句出了什么问题。对吧,那这样的话,我们就把刚才的这个里边的。编译时异常是不是转化成了运行时异常,且我们对这个异常并没有去catch做处理,对吧?它是一个运行时异条,我们并没有处理,如果一旦异常发生,它是个程序就挂掉了。程序是不是就停掉了?能明白吗?对吧,这就是我们希望程序停掉的一个做法。
33:04
啊,就画这个编译时异常为运行时异常,然后不处理这个运行时异常。对吧,不做处理,那那一旦发生异常了,那我们手动抛出一个运行异常,那他任务就怎么样挂掉了。OK吧啊,这是我们希望就挂掉,如果你不希望挂掉,你把这个一条抓到以后,你就打印对战信息也好,或者打印一句话也好,或者做其他处理也好,你你就处理一下,对吧?啊,我们通常做法是这样,但是呢,很少这样去做吧,啊,这是我们。将编译实际上变成了。运行是异常对吧,你就可以不处理这个异常了啊。好,那接下来呢,第三件事情。啊,就是写到状态里边广播出去,他比你笨吗?啊,你这么说人家。我到时候去问问他好吧。第三件事情写入状态广播出去,对吧。
34:04
写入状态广播出去,呃,那我们要把数据写到状态里边,那我们得有状态才能放进去,对吧?那这个状态在哪取呢?很简单,CDX啊,这个上下文对吧?Ctx点叫get broadcast state。啊,这是它对吧,获取广播状态看他要get对吧,那这个里边。他要一个什么,要一个map state诶。这个东西我们。是不是?写过。对吧。咱写过这玩意儿吧?State,所以大家有什么想法?我们写过这个东西吗?那大家告诉我,你有什么想法这块。
35:04
啊,有什么想法。CVCV嘛,拷贝过来啊,不用拷贝过来,我是不是可以通过参数传进来啊。对吧,哎,比如说在这边我干什么呢,这写了一个map state,我呢通过。构造方法传进来。是不是这样更好吧,对吧,啊好那。这报错,因为构造方法没写啊,那我们来写一下,这边呢,我们声明一个变量。声明一个变量,然后呢,写一个构造器。工作器呢,只写他。对吧,诶把构造方法写上,那我们这个东西就有了啊,它就有了对吧,而且这边不报错了,那么写过东西你不要CV过来啊,这个可以传过来对吧?啊,因为你在完全可以传过来,那这就有了。
36:07
CR加宾得到一个广播状态,接下来呢,把数据放进去啊,那我们看一下看对点,诶就用put put呢一个key一个value key我们说了是不是soft table呀,Value它自己对吧,好,那这边写table process点。Get soft对吧,然后VALUE6是他自己的,VALUE6是他自己好,那写到状状态里边就够了啊,广播出去这件事儿呢,他自己做。啊,广播出去这件事儿呢,他自己做啊,就不用你说还调用一个方法广播对吧,因为他本身就是一个广播状态,他自己这个状态就是会发送到所有的病因度的,所以你就不用操心了,你只负责把数据。写进去。就好了,OK吧,好,那到这一步为止呢,咱们终于终于把。第一个方法。
37:01
处理广播流的数据。搞定回吧,嗯。
我来说两句