00:00
好,那接下来呢,我们就写核心的一块内容,那么第一个我们先构建一个。连接池对吧,我们得创建一个连接池啊,那很简单,我们在这面上声明一个变量。在这儿去声明变量对吧,诶我们也可以给它附一个初始值啊,然后接下来呢,在这边做它的初始化吧。啊,这个呢,其实可以不用这个static啊,啊,然后呢,就用我们刚才的那个工具类啊,德鲁伊的工具类。啊,DU9点create data source对吧?啊,那我们这个就构建好了,构建好之后呢,我们就可以在这里边去获取连接。对吧,啊获取连接啊,那那样在这边同学啊,获取链接。啊。然后呢?写出数据啊,最后呢,归还链接。
01:01
因为这个时候呢,我们叫归还链接了,对吧?啊,获利链接我们从池子里边拿到的啊,然后所以我们归还就分为这三步啊,第一个呢,我们刚才都已经尝试写了,那这个德鲁伊data.get connection。获取一个这个链接对吧,呃,最后呢,归还链接,那就是点。Close好,那这个close呢,我们来看一下啊,这个什么东西啊。如果说我们池子不会空,它是它它这个啊,我们拿的是这个链接调用close,它不是说把这个链接给它关闭掉了啊,我们把这个看看能不能有说明啊。这不太好下啊,那么大家说一下啊,就是我们虽然啊,他这边也没有这个写这个。注释啊,没有写这个注释,那算了,那我跟他说一下,这个看上去好像是把连接去关闭掉了,对吧?啊就跟一样,我们用连接池也是调用close,但实际上如果你用的是连接池,它它其实是一个归还操作,它不是真的把这个连接释放掉了,它不是的,对吧,它是一个归还操作啊,那这就这样好,那写出数据。
02:20
啊,写出数据啊,那我尽量根据文档当中来吧,因为文档当中呢,我们就封装了一个工具类啊,封装了一个工具类啊,那我们写出数据呢,我也在这边封装一个工具类,好吧,工具类呢,类名我拿一下啊,尽量跟文档当中保持一致。啊,里面内容呢,我们就自己写一下啊,叫Phoenix啊。Phoenix,然后呢,这里面有一个方法叫public static。啊,然后插入数据嘛,那我们avoid就要对吧?啊,插入数据叫inser啊,或者说我们叫UPSUPS这个value。
03:03
啊,我尽量跟这个文档保持一致啊,啊,那为什么我不用音色的,就文档当中呢?其实这块我们用的是之前写的是音色的,我突然想用阿色的可能更好一点啊。为什么?为什么阿的更好一点啊?因为我们现在是要将数据写到这个。Phoenix。Phoenix呢,它的新增与修改。它不像my soccer对吧,My soccer呢,新增音色的修改呢是update。而在Phoenix里边,它的新增与修改用的都是什么?Up的这个关键字,这就是涉及到底层存储用的是I,对吧,I呢,它的插入跟修改用的都是同一个操作,叫put。对吧,它用的都是put,所以呢,它新增与修改都是同一个,那Phoenix呢,也得用一个,那你用是circle,你本来是ins色跟update对吧,那所以呢叫up新的修改合成了一个啊所以这个要注意一下,可能大家已经忘了这个事情了,对吧,或者说记得的人根本就不多了啊呃,当会用的关键字啊,是阿色的OK吧啊用的阿阿色的好,那我们想一想这个地方我们。
04:29
参数。要什么?对吧。我们要插入数据要什么参数啊,比如说到这边来,我们调用的时候,对吧,到这啊调用的时候就拿着这个Phoenix u.AB values对吧,我们应该把什么参数传进来,它才能够。写入数据。啊,那里边儿呢,肯定就是一个。JDBC调用的一个内容对吧,那我们要放什么参数啊,大家告诉我。
05:06
咱们要放什么参数啊。首先第一个连接肯定要传进来吧。对吧,你得有连接,你才能最终去编译S去执行啊,对吧,连接。然后呢?然后在这里边咱们是不是还要拼接S语句,然后呢,往外写对吧,那我们的思维语句,那不就是一个data嘛,一个数据是不是对吧,我们得有数据放进来吧,是不是数据在哪呢?Value,但是呢,这个value啊,我们并不需要把它所有的东西放进来,大家想是不是。对吧,我们并不需要把它所有的东西放进来,那这就涉及到VALUE6,它长什么样子,注意VALUE6呢,它来自于我们流,这是一个性格,对吧,来自于哪来自于这个流,那也就是说我们的数据长什么样子,我们得到这儿来找对吧?啊那。
06:05
在这里边。这是process broadcast element,它不是它,那我们得找谁啊,找process。Element找他对吧,它的数据格式呢,长的样子。啊,或者说呢,我们把这个拿过来。对吧。好,那你在做任何数据处理的时候,你得知道这个数据它是什么格式,当然这个还不全,注意啊,它并不全,为什么?因为在我们这边放入数据的时候。我加了一个think table,大家注意了吗?对吧,所以。到了下游D方程这边的时候,注意啊,我就加到后面对吧,在这加一个什么呢。S方程,然后冒号双引号叫DM小划线xxx,我就这样写一下对吧,好,那这边同理也是这个东西。
07:01
对吧,他也有一份这个。啊,因为这个呢,是我们的表明。啊,我们表明好,那到这块为止,我们就比较清楚了,我们要放什么东西进来,就是最终要写出去,那这个s table要不要。那必然是要的,对吧,好,那我们在这边。value.get string啊呃,把这个呢叫。Think table传进来对吧,这样的话我们就得到了一个表明啊,然后当然就是我们数据本身了,哎,就什么,就那个地方有一个date。Date。对吧,这个date肯定要放进来。啊,肯定要放进来啊,当然到了我们这儿的时候,这个东西就不存在了,是吧,因为过滤掉了啊,到了这个流里边这个就过滤掉了嘛,对吧。好,那我们就要把date存进来,数据本身,因为这里边呢有列名有列值对吧?好,表明列名列值都有了,我们搜就可构建起来了,对吧?好,那在这边呢,Value点给杰森object,注意一定要用object,因为下一个呢,还得加工二加V得到一个数据,好那我们要放进去的呢,就是这个。
08:19
Connection。Table加。对吧,大家想一下这个有没有问题,能跟上吗。我们未来要把这个数据写出去,我是不是应该。如果说我们写了个工具类对吧?啊,你要不写工具类,你就直接在这儿就拼接了啊,那我们要写一个工具类,我们是不是应该有连接表明加数据本身啊,能跟上吗。OK吧?啊好,那我们呢,这个方法呢,就要重新去我们去创建一下对吧?啊这个呢,我们就给它干掉呗,改了之后呢,让它自动生成out加回车对吧。
09:08
然后呢?创建。啊,直接创建那就好了,对吧,好,那这个呢,我们写一下啊呃,这个我们未来传的是菲ix连接。这个是表明啊,输出表的表明对吧,这个是数据。啊,这是数据本身对吧,好,那我们就这个东西,那这里边儿呢,我们要能够去执行,所以第一步呢,我们得去拼接。Circle语句对吧?好,那第一个第一步我们写一下拼接circle语句啊,那第二步。预编译课第三步执行。啊,第三步执行啊四呢。
10:04
释放资源啊,那咱们呢,要做的就这几件事情,好吧,啊啊,那拼接so语句,我们先来想一想,这个so语句应该长什么样子,对吧,我们在这写一下叫阿。Into DB点填对吧,好好,那这里边呢,应该是ID,比如说啊,我就随便写了ID name对吧?Sex好啊,然后呢,Values括号啊。然后呢,ID1001对吧?嗯,因为我们都用的是war差嘛,都用的是war差好,那这边呢是name对吧,张三啊,比如说我们就随便写,我们就没有用那个表明啊sex有没有对吧?这是我们的一个搜句。啊,那咱们要根据表明加这个值,把这些东西呢拼接起来。
11:02
啊,拼接起来好,那这个贝塔它长什么样子。数据啊,比如说这个呢,是表明是TN对吧?好,那数据本身呢,是一个接算格式啊,它长这样子打官。好,我给大家稍微的去写一下。呃,咱有三个字段对吧,这边呢是ID啊,然后呢,它是1001,我是结合着这个来写的,对吧,给大家举个例子在这啊这样呢,到时候大家好理解一点,Name这边呢是张三。进来张三好,那下来这个最后一个字段是咱们的。对吧,这边呢写的是mail OK吧,好,这是数据本身就是这个data,然后呢,我们要。TN加这个东西,把它拼接成这个这玩意儿,那很明显大家看到在我们数据里边呢,它是KVKVKV,而到了so个里边,它是不是K在一起。
12:01
Y6在一起发现没?对吧,它是K在一起,VALUE6在一起,所以很明白我们在拼接这个搜索语句之前呢,我们是不是应该从这个里边把K和Y6单独的获取一下。这个没问题吧,对吧,因为你发现到我们数据本身传过来的时候,它是KVKVKV,但是最后呢,我们用的时候是什么k value分开的对吧?好,那我们写首先啊,先获取data里边我们当时就说了ts object的呢,你当做map来处理,那map里边获取K,那是k set对吧?得到这个是列名columns啊,然后data点。Value这个呢,就是我们的值啊,就是正常的,我们就叫value就行了啊,这是值两个集合,对吧,因为未来呢,我们要把它放在一起,把这玩意放在一起。好,那家来听听搜狗,那就是three。啊,那么得到一个收口对吧,啊,等于。啊,然后怎么写呢,首先这个东西呢,我们可以直接写,一直到这个位置对吧。
13:05
啊,DB拼接啊,DB咱们是g more con.stem啊,然后再拼接一个点,在拼接上咱们的表明叫think table,好,那么咱们已经到哪了,到这个位置对吧,接下来呢,是一个括号。啊,接下来是一个括号,那么我们已经拼接到这儿了吧。好,那接下来是ID name。ID name啊,那很明显要用到它了。用到columns了,对吧,那还是一样的,这个地方呢,咱们是不是想着对它进行便利,然后往里面去追加,而且呢,当它不是最后一个字段,咱是不需要加逗号。有没有问题啊,就是当他不是最后一个字段的时候,咱们是不是要加逗号,这个东西我们好像之前写过吧,对吧?啊,但实际上呢,这边我们可以不这样做。
14:03
啊,我们可以不这样做,因为在Java当中它有一个工具类啊,可以方便我们使用,那什么呢?来我们写一下在拼接。加string。啊颠,Join。然后呢,把这个columns放进去,再加一个逗号。这个东西啊,这个东西我给大家做一个说明。它呢相当于什么,它的返回是结果,相相当于大家呢,可能Java咱们不熟,但是skyla里边你肯定熟。SKY里边有一个这个方法,你记得吗?它的返回值结果是什么?
15:00
啊,它就等于它,它等等于它啊,然后呢,我们的返回值结果是什么?知道吗?返回值结果就是这个。啊,当然是一个字符串啊,返回值结果是一个字符串,Make string嘛,对吧,当然了,你要是不写字符串,因为你都知道了,你就可以不写字符串,就是它假如说你的列名是ID列X,它返回值呢,就哪里呀。啊,就在Java里边呢,它speak u.join就相当于是谁呢。Scale里边的一个mix,这个操作大家总还记得吧?把一个集合变成一个字符串,还记得吗?这个也忘了啊,反正就是问什么东西都忘了是吧。这个可爱,记得。其实你不记得也没关系啊,我就告诉你了这个方法返回值就是它对吧,好,那你就不用去操心,它是最后一个还是第一个还是什么样子,反正用逗号分割对吧?好那到这块为止,我们这个搞定了,注意加。
16:03
什么呢?右半边括号,然后呢,Y64。左半边括号。对吧,哎,咱们呢,把这个这就是正常字符串嘛,接下来是不是拼接这个值啊。拼接这个值对吧,好,那咱们再拼接啊,那一样的,那有的人说我学会了对吧,Three us.join。然后呢?逗号呗,搞定了对吧,然后最后不要忘了,哎,那同学说还记得啊,把这个右半边括号给加一下,因为你这样一拼接只有它,诶右半边括号加一下,这样对吗。大家告诉我这样它对吗?
17:10
哎,陈总说了这个不行,他很明显跟前面那个列名不太一样啊,还有单引号,那怎么办呢,那这这玩意儿呢,我是。这等于二它它不是这样,如果这样就好了,对吧,如果说我们的值呢,它长这样就好了,那不行啊,我们都是用的过差,对吧,你你不能这样写,你这样写不就报错了嘛,对吧,你肯定有这个单引号,那我们怎么办?嗯,那要不然我们还是一个一个拼接。我们还是便利得了。啊来不用啊,来看啊,注意这边有一个骚操作啊,一个骚操作怎么做呢?来注意看啊。我们能不能认为它的分割符是这个整体啊?就是你比如说后面还有列,那是不是他还得是这个作为整体就是它。
18:06
我能不能把这个作为整体当做分割符啊,大家告诉我。啊,这边有个骚操作啊,我能不能把这个当做分割符,但是你是不是缺了一点东西,缺了这个。缺了这个吧,一头一尾你没有用对吧,因为中间分割符是不是它好,那你看怎么做啊,这边首先分割符呢,咱们单引号逗号,单引号作为分隔符,你不少了它跟它吗?哎,那你少了它在这补。前面这个是不是在这补一个对吧,右边在这补一个。看啊,在这补一个是不是好了。好,我们把它作为分隔符,是不是这样写?接下来。是不是如果说你把它作为分隔符,是不是这个东西跟这个东西少了,那怎么做呢?这是不是写到这了,这个写到这了。
19:01
OK吧?啊,可以这样去操作一下对吧?啊好,那这样的话呢,咱们三个语句就搞定了。啊就搞定了,不用去遍历拼接啊,直接用这个工具类就好了啊,那如果说你你不知道这个工具类啊,你自己写的时候。啊,你自己写的时候呢,你可能就拼接拼接也无所谓,对吧,啊,你就编译拼接一下这个无所谓,好大家的编译circle,那么就拿着连接啊点叫prepare statement。去编译那个烧烤。啊,编译了一个circle对吧,好,那这边异常呢,我们回头再说啊,我们应该怎么处理啊。啊,那么接下来呢,我们要执行啊,那一正常的预变一搜索之后,是不是给占位符赋值啊,在M这个so拼接起来没有占位符没有问号对吧,没有问号呢,就不用给占位福负责了,直接。爹。执行,然后呢,我们。
20:05
提交啊,最后呢,释放资源,注意真正的点就行了,不要这个不能关啊,你不要把连接关了,为什么。连接传进来的对吧,你你传进来参数你不能在里面关啊,你要真要关是不是我们在后面在这关的。对吧,我们是在这个位置关的。啊,咱是在这个位置关的啊,所以呢,你不要在这去把这个connection给他。关掉了。OK吧啊,不要把这个connection给它关掉了啊,行,那这个东西呢就搞定了啊,他这边给我们这个飘黄,因为它检测到这是一个。检测到了,这是一个色语句啊,所以呢,嗯,你偏黄对吧。你可以放在上面,他已经知道了。它是一个三个语句对吧,好啊,那接下来就是关于这个异常的问题。
21:02
这是一个工具类啊,注意这种工具类里边异常呢,一般来说,如果你真的封装工具类,一般来说呢,都是抛出去。啊,都是抛出去。对吧,啊呃,为什么呢。啊,为什么对于工具类里边异常呢,我们会抛出去呢,因为你想工具类这个东西,它既然作为一个工具类,那有没有可能。是未来有很多人调用。对吧,我们写成了一个工具类,不就是为了提取出来给更多的人去用嘛,啊,那要不然你要是自己用,我是不是完全可以在这儿写啊,把所有的刚才那个代码写在这儿,对吧?那这样的话就是你只能自己用,你不能给人家用啊,那既然你写成工具类,你就是为了考虑到可能有其他的人也要用这个内容。好,那。你这边出异常了,这里边如果说出异常了。对吧?啊,那如果说你在这里面处理,那是不是未来所有调用这个的人都是统一的处理方案。
22:01
你想?对吧,那如果我抛出去呢,抛出去之后。我这个地方。可以去捕获这个异常。对吧,我可以对它进行check catch捕获这个异常,好,那你在调用的时候补一张有什么好处呢?那每个人调用的时候可能异常是一样的,但是我要处理的方案是不是有可能不一样。能明白吗?就是虽然你跟我都去调用这个供应类,诶我俩呢,都可能是这个S写错了,或者什么样子报错了,对吧,但是由于两个业务不同,是不是有可能两个地方处理异常的方式它是不一样的。对吧,所以呢,我们在工具类里边把异常呢给它抛出来,在外面呢你去处理。啊,在外面你去处理。对吧,这样的话就能做到你不同的业务针对于同一个异常有不同的处理方式啊,当然有的人说我这个异常,那我未来所有的处理方式都一样,我写在里边行不行,那可以啊。
23:08
能懂这意思吧,所以往往呢,对于一些工具类的异常呢,我们可能就把它抛出来啊,谁调用谁发生这个异常了,谁处理对吧,好,那简单,我们就直接在这。CTRL加T对吧,然后呢,做一个。Try catch。啊,我们可以做一个catch对吧,这个捕获的就是exception,因为在这个里边。咱们抛的就是so exception,那能大家想,诶我这边抛异常了,刚才这个怎么没有报错呢,对吧,因为这个方法本身啊,你实现的这个方法本身,它抛了一个更大的异常,所以他就已经把这个异常处理了,如果说你想单独处理这个异常。对吧,你可以这样去做。啊,您可以这样去梳理一下。啊,好,那我们想一个问题啊,这个是将数据写到Phoenix,如果它发生异常了,我们要不要让这个任务挂掉?
24:01
啊,咱们要不要让这个任务挂掉。对吧,是让他继续往后执行,还是说让任务挂掉。就不走了,反正这个操作如果失败了,那么就写出到Phoenix失败了,对吧,大家想一想。如果写数据到Phoenix失败了。我任务是继续执行还是让他挂掉?啊,你看有两个同学说了,但是两个答案呢,截然相反啊,一人一个一个呢说继续执行,一个说应该挂掉,那我们再来分析一下这个数据,如果写出失败会有什么影响啊好,那我们现在呢,将这个。
25:06
DM数据要写到菲利克斯对吧。要写的菲利克斯好,现在呢,我告诉你,写失败了。写失败了,就是这个任务还要不要执行?对吧,不是这个问题吗?写失败。写失败有什么影响呢?那就是说我比如说杀入一个18爱的硅谷。At硅谷对吧,写失败了,那也就是说MYSO里边有这个数据,但是Phoenix没有。他造成的直接后果是不是这样子的?对吧,就是你的Phoenix里边没有18这个数据。DM表没有创建成功,后面也没法继续做了。嗯,对呀,现在不是见表。怎么还是见表呢,牛总?见表的事情已经过去了啊,这已经不见表了,这写出数据了,表肯定创建好了呀。
26:03
这不是监表了呀,监表我们是挂掉吗?那个讨论过了,你怎么还停留在周六呢啊牛总这不对呀,你这这这少过两天你在讨论周六的事情,我们现在已经周一了。刘总行行好吗?这表都窗户经过了,现在这写出数据了。啊,你的意思是。表数据错了啊,那你这谁能看出来是这个意思啊。你说表没有创建成功。啊。对吧,好,那我们想啊,直接的后果来跟上思路,直接的后果是不是导致Phoenix里面没有18这条数据啊。是不是就没有18这条数据啊,大家想。对吧,他就会没有18这条数据,它直接的后果是不是这样好,那我们在想他会对我们其他的业务有什么影响的,那其他的业务来看啊,我们假如DWD层已经搞定了DWD呢,要拼接我们的DM,形成我们的什么。
27:10
DWS什么?做维表关联嘛,把事实表跟维表呢要关联到一起,然后呢,形成我们的DWS层好。那就会导致如果说我DWD实时表里边有一个18这个ID,然后去Phoenix查,那就查不到,那这个维表信息呢,就补充不到它的影响是不是这个。对吧,那从这个角度来说,我们是任务继续执行还是应该挂掉的。从这个角度来说,应该是继续执行还是挂掉它导致的后果?是不是说这个维表关联不上啊。对吧。啊,说这个维表关联不上啊,会导致这样的一个后果对吧?啊,那你就看好这里面呢,其实两种方案都可以啊,那听到这块的时候,大家可能心中的答案都应该是挂掉,但如果说我加了这个操作,未来我在关联维表的时候,对吧,如果我在菲ix找不到。
28:14
我去买烧烤查一次。我走一次买搜狗,我保险起见,对吧,你菲那斯没查到,但是呢,我我走一次买搜狗,这个是。挂掉还是继续执行,如果我只只查菲enix,如果我只查菲ix,它确实应该怎么样挂掉,那如果说我不光查菲利斯,我查菲ix没查到,我还查买S呢?我能不能继续执行?我能不能继续执行?可不可以?可以吧?
29:01
对不对啊,这个很明显是可以继续进行的。OK吧啊,是这样的一种现象啊,这个要注意一下对吧?啊,那就看你未来怎么写对吧,两种方案都可以,但是两种方法会影响到未来啊,那咱们这边呢,我就不去读这个买so了,我就只读我们的。Phoenix,可以吧,好,那简单,我就不做这个什么。全开始了,我是不是也可以这样写,那如果说你失败了,你失败了我就。哎,那这个不是through exception吗?就把异常抛出去了,他是不是最终会导致任务挂掉啊。对吧,它会导致这个任务挂掉啊,也就是说你什么都可以。不写了,是不是这样也可以处理一下呀,对吧,好,那我就未来只依赖于谁。我只依赖于我的菲ix,如果菲ix没有这个数据,那就不行,对吧?啊那。我是不是可以这样写,如果说你用另外一种方案,假如菲尼没查到,对吧,你去买搜查一下,你未来写的复杂一点。
30:03
那你也可以把这个异常补货了,对吧,打印诶这个哪一条数据写出失败对吧,告诉你一下,写到日志里面也好,或者打印出来也好,对吧,都行。能明白这个意思吗?所以这块有不同的处理方案,对吧,而在文档当中呢,我们所写的。大家看一下。这边呢,就把这个异常也是。抛出去的只不过是单独的去补货了。这异常。OK吧,单独的去try catch了,这个异常就是说数据写入失败了,对吧?啊,就是单独处理一下,这样行不行呢?也行,你还不是抛了一个异常吗?啊,抛了个运行是异常对吧?啊,那我们呢,直接从方法去抛也可以对吧。能明白吗?这个点同友们,其实它的一个处理方式比较多啊,会涉及到你未来这个东西应该怎么去写啊,好,那到这个为止呢,咱们这个就搞定了,对吧,就搞定了,搞定之后呢,咱们就在这边可以来用一个啊,把这个补充上叫dim方式。
31:07
结束了对吧,那通过这个S呢,我们就可以将数据写到Phoenix。OK吧,好,那这块呢,咱们就编码就搞定啊。
我来说两句