00:00
呃,那接下来呢,在这个里边,我们就要开启这个。线程池去处理我们的业务,那先这样吧,我们先把它写了,他报如果超时了对吧,因为这个地方为什么超时呢?最终我们看到这边调用的时候,调用的时候它需要传一个时间进去。一样的也要传一个这个时间进去,对吧?呃,100欧也会有超时,假如说100欧你一直没有没有响应。一直没有响应,那不就超时了对吧,你超时了它就走的这个超时的一个内容啊呃,生产环境当中,你超时了之后,你可以在这再发起一次请求啊,因为是超时不是挂掉了对吧?啊,你发起一次请求,但是我们就不发起了啊,因为我们是虚拟机,所以呢,我们直接come out。好,然后呢,拼接上我们的input,就是我们的数据。对吧,啊,拼接上咱们的一个数据就好了,嗯,好,那接下来呢,具体的要写这个内容了,这个内容里边无非就是发送请求,然后合并数据,对吧,最终呢,在外面去调用好,在外面调用好,那这个时候呢,我把有的东西关一关啊。
01:12
现在呢,只剩下他俩啊,那这个函数写好了,未来怎么用呢?这个时候注意就不是用map方程了啊,我就可以把它干什么注释掉放在这了。对吧,这个东西注释掉啊好,那我们只能一个一个维度的关联了啊,就关联这边我们写一下4.1。叫关联用户维度。啊,关联用户维度,一个一个关联啊,这样方便一点,那我们现在看到A关c data塔stream点,那我们说了这个地方只是关联维度,所以跟顺序无关,所以我们用on a的位置。对吧,然后这里边呢,第一个写数据流,那数据流呢是all the way。With no DM DS对吧,第二个位置要一个ANC的一个方式,呃,咱们自己的DM。
02:04
ASN的一个方式,呃,这个泛型呢,当然是all外了。对吧,翻译是outb,好,那接下来第三个超时啊,超时时间,比方说这个地方超时啊,注意呃,大家要知道我们连接Phoenix先访问ZK,访问ZK那个超时时间呢是60秒,所以这个地方的超时时间应该大于60秒,能不能理解?我刚才说了,访问Phoenix的时候,先要访问ZK,那个超时时间呢是60秒,所以这个地方我们的时间应该大于60秒。能不能理解?这个应该没问题吧,对吧,所以呢,我们给一个至少得给一个什么60啊,至少得给一个60啊time.second。
03:03
至少得给一个60对吧,那未来呢,就要这样去用好,那此时第一个关联用户维度,那我们就得到了一个all wide叫with。User DS对吧?啊大概的这个流程呢,我们先量。先这样写一下啊,先这样写一下,因为等会呢,我们可能还有其他的一些操作,对吧?啊,这是四个参数啊,四参数在这对吧?好呃,那用户维度接下来呢,我们这里边来来写要关联用户维度啊,然后呢,把关联好的数据呢写出据,写到流里边,也就通过这个来作用的,对吧?最后的用法在这这样去用啊好,那接下来的问题就在于我们这个地方要获取数据啊,对吧?首先我们点submit提交一个任务。对吧,我们在这里边呢,要去提交一个任务啊,用现场呢,自己去返回自己的一个数据。
04:05
对吧,好,那这个wrong方法里边我们要做什么事,我们要。查询维度信息对吧,第二个补充。维度信息,那么第三件事情就是将输据输出补充完的数据,合并好的数据做一个输出对吧?呃,那查询维度信息我们写好的工具类了,那就用的dim u求。点get.in for,好,连接有了,接下来完了,接下来这两个东西,一个表明,一个ID,让大家想一下。首先。ID是不是来自于这个数据?是不是来自于数据啊。对吧,好,那表明从哪来呢。
05:06
我数据里边可不带表明啊。大家想一想,这个时候怎么办?啊,思考一下啊,这个整个函数的精髓就在这一点东西了,就在这一块了啊。代码的难度也在这块,想一想这两个值怎么办?一个是。表明。一个ID我们怎么来?有没有同学来说一说?
06:00
想一想,想一想。想想类似于以前我们怎么做的,对吧,以前写的代码当中有没有类似的这种东西。传参。构造器啊,构造器传进去,OK,传哪个,这两个值都能传进来吗?穿哪个呀?可以传table name ID是不是不行啊?对吧,ID是不是只能根据这个input来获取啊,因为ID你从外面怎么能传进来呢,对不对,ID是来自于数据里面的,也就是说只能从input,所以说呢,我们在外面可以干一个什么事啊,在这传一个DM叫user。
07:13
For,哎,通过参数传一个表明进来,这不就搞定了吗?对吧?好,传参来这边呢,我们定义一个参数private string,类型叫table name,对吧?那我们要写一个构造方法了。只选这个table name。对吧,好构造方法,然后接下来呢,表明就有了table。Table name,好,那这个呢,也不报错了对吧,表明有了这个ID怎么办?要通过它来获取吧。这是一个泛型对象,我们怎么获取到ID呢?而且你要注意啊,那现在我们访问的是user info,但未来是不是还要关联什么?
08:02
比方说我们可能还要关联这个。地区维度,地区维度对吧?也就是说我们还要再关联其他维度,每一种维度当中ID是不是都不一样,关联用户维度用的是U的ID,关联地区维度用的是provin ID。对吧,啊,那怎么办呢。我能通过反射的方式直接获取ID吗?对吧,这块可以怎么做,想一想。这个ID,那肯定要根据这个input来吧,对吧,我们要获取当前这个表的一个组件。有的人说反正都叫ID,你直接获取ID呗,不行,为什么?因为在out we当中,注意在out we当中每一种维度呢,它名字都不一样啊,比方说在autobd当中来看,如果用户表,那比方说我们的用户表,呃,咱们要获取的是user ID,对吧?如果说你要找地区获取的是province ID,它并不是叫ID,它叫这个名字。
09:15
对吧,所以没办法在这里边写死获取ID那怎么办。对吧,这是泛型,我们要对应的获取这个ID啊这些东西,那怎么办。想一想,这块我们应该怎么做呢?那好啊,那这样首先我们肯定要根据这个数据要获取查询的主件对不对。
10:05
才能用吧,好,那我把这个先写下查询的主键啊,那先写好啊,因为肯定要get key啊,这个key里边呢,肯定要传一个input的,得到一个string类型的ID。对吧,肯定要得到它啊好,ID先写上ID先写上这个有异常对吧,异常等会我们再说啊,然后呢,我们自己去写这个实验这个方法。我把这个方法。创建这个方法,直接创建到这个类里。Get a key。我给它放上来啊,放到这来对吧,这样好看一点,大家注意看啊呃,那这个有异常对吧,这个有异常,那这个异常呢,我们可以先呃。抓一下,等会呢再处理对吧?呃,那这块是不是不报错了,我让他先返回个档,是不是不报错了,但是这个不报错有用吗?是不是自欺欺人。
11:10
是不是自欺欺人啊?对吧,你直接返回,那好,那现在我们要研究的就是这个地方应该怎么写,对不对。思考一下啊,想一想我们应该怎么做。泛型对象。然后呢,这边。不好获取值。想一想,之前好像遇到类似的问题。之前好像遇到过类似的问题,我们怎么做的?想一想啊,这块比较比较经典了,对吧。Meta信息元数据。不行啊,我说了不行,因为你每一个表获取的这个字段都不一样,你获取原数据怎么办呢?
12:09
写到外面,那我怎么样才能写到外面呢?我怎么样才能在外面写呢?我怎么样才能在外面写这个内容呢?怎么做呢,才能做到这个事情呢?直接在外面调蒜子的时候用匿名内部类,并指定泛型为order。
13:05
那么就没意义了,那我这个写泛型不就没意义了。那我直接写out的得了呗。那那那你这个每一次调用的时候写那么一长串。写那么一长串对吧,写个接口,不要接口,要什么接口呢?对了,范总说对了啊,我们把当前这个方法变成一个什么。抽象方法,不写时间类。啊好,这边变成抽象,那这边叫什么类,就要变成抽象。对,好,那这里边儿有一个抽象方法对不对?好,那调用的时候我们要实现这个抽象方法。实现。哎,等会啊,实现当前的。抽象方法。
14:00
对吧。啊好,那这样的话写出来了,注意看啊,在外面调用的时候,咱们的类型还是T吗。还是T吗看。在外面用的时候就已经不是T了吧,而是什么?All the white。而是all the,看见没?对吧,还是一样的,里边呢,不写不写死写不写不了对吧,一样的,跟之前我们写那个卡不卡那个一样的,在里边呢,我们通过泛型没办法获取我们的think table,所以我们给它写出去啊,那所以呢,用一个抽象方法,那这不就搞定了吗?这是user那我获取的。对应于这个all we,我们可以获取all wide的什么?All的。
15:03
Get user ID to string。这不就好了吗?对不对,那里边呢,我们用的是一个抽象方法。啊,里边咱们用的抽象方法,那这个时候当真正这个函数被调用的时候,是不是走的,它会走这个地方。返回用户的对吧,你要是地区的,那你就自己写地区的,哎,每个人有每个人自己不同的ID,对吧,我们可以写成抽象方法在外面来实现,之前还给大家提到,所以在定义框架的时候,对吧,写框架我写什么东西的时候都喜欢用抽象类接口,为什么不就在这吗?对吧,因为有很多东西框架没办法帮你定死,只能你自己去写啊,谁用谁写对吧,那这个时候就搞定了,好,那既然这样的话,我把这个串上串大一点啊,传到这儿对吧,然后补充信息都放在这儿。
16:05
好,这个是维度信息查到了,看R加V得到一个DM for,好,那接下来if,这个DM for,它不等于那。我们这个里边是不是要补充维度信息啊,那这个是D压密,我们要补充到T上面,那这个怎么写。那这个怎么写?每一张表要补充的字段是不是也不一样?每一张表补充的字段是不是都不一样?
17:00
而且。往泛型里面补充,那怎么办?再来一个测量方法,哎,对了,这个时候大家就会了,对吧?啊就会了,学以致用,刚学的立马就用,对吧,那我们可以写一个drawing方法,对吧,里边呢,传一个input数据,传一个DR for,好,然后把它呢也写成一个抽象的方法。对吧,也写成一个抽象方法,假如说这个呢,我们就要这个啊,然后CTRLX,我给它放一块啊,给它放一块放这。放这就行了,对吧,好,那接下来这个地方要实现是不是这里边在奥德加回车实现这个方法,诶在这个里边我们就补充,因为到这儿的时候第一。什么东西啊,咱们的input是不是确定的,Out,第二个咱们的表是不确定的,我们要补充哪几个字段也就知道了。
18:06
对吧,啊,就这个内容啊,就这样用抽象方法来解决我们泛型的问题啊,未来在工作的时候,只要你希望这个东西啊是非常通用的,那注意你就会用泛型,如果用到泛型的时候,切记抽象方法是一个非常好用的东西。一定要记住这个啊,就是只要你因为你要是写框架,或者写通用的这种工具类,或者什么东西往往都会用到这样,因为你要给人家用,人家用的时候呢,什么类型你也不知道,你只能写泛型,那既然泛型你在里边也不好操作,人家要什么字段你也不知道,对吧,所以你就写成抽象的方法,让人家自己去写。是不是能理解这个思想嘛,这个思想更重要啊,对吧,因为未来你到工作的时候,你不想把这个代码写的又臭又长。就要就就应该用这样的方式。
19:03
对吧,那你想啊,如果说这个地方图简单,咱们是不是可以写成out。直接写out是不是简单对吧?Out很简单啊,但是呢,有一个问题,你未来这个东西不不通用,只要换一个类型,你一定要写一次,换一个类型你要写一次。但是大家想有必要吗?那肯定没必要,对吧,我们写成泛型啊,但是泛型呢,肯定给你自己编程带来一定困难,因为你不知道泛型里边怎么操作了,所以有的东西呢,你就写出去,告诉人家这个东西干嘛的,对吧,就行了,好,那接下来呢,我们把这个补充完整啊,补充完整呢就可以把这边返回了,对吧?好,那这边呢,我们去写一下啊呃,那从d in for当中点get STEM。呃,比方说这个当中我们要获取什么东西呢?来看一下关于用户,用户呢,我们要获取两个,一个u age,一个U的gender,对吧,那我们就看一下这两个字段在h base里边的命名啊,我们找到U。
20:04
来看一下这两个字段啊。我把它拿出来。定在这。对吧,这个字段就是我们Phoenix建表字段,所以呢,我们先获取这个,呃,它有两个东西嘛,一个是user edge,一个GE的,对吧?呃,那age的话,那我们只能获取这个birthday了啊。先获取他的一个生日,然后要获取他的一个gender gender呢就是真的。对吧,好,这两个呢,注意在菲里边都是大写ctrl shift加U啊变成大写对吧,得到一个粘的,那它呢,很简单对吧,我直接不用加工嘛,所以我直接这样啊,这个呢,我。CRX给他拿一下,这行就不要了,对吧,我怎么做呢,直接OY的点。点set我们的。
21:04
Use the gender对吧,然后呢,把它扔进去。这就好了,好,但是呢,这个地方我们有的是一个生日对吧,生日呢,我们要做一个加工,这个地方,呃,网上呢,你搜一下生日转化为年龄方案比较多,好那这边呢,我们就我用一个投机取巧的方式啊,简单一点啊呃,那怎么做呢,这样啊。呃,我想一下啊,生日。首先有一个。生日它的一个格式呢,是YYY杠白M木杠DD。得到一个SDF对吧,然后呢,获取当前时间system current minutes。Ten minutes。对吧,呃,然后接下来呢,用SDF点。点什么呢?点pass。Pass,生日传进去点。
22:03
啊,这个呢,有异常对吧,解异常呢,我们可以把这个异常抛一下对吧,抛有解析异常啊,还加倍得到一个。TS,好,呃,然后接下来我们做什么事呢?我们用的TS减去这个TS。这个代表这个人从生日那一天起到现在活着的毫秒数啊,除以除以一个1000。这个是他的活的秒数对吧,乘以60,这是分钟数,这个是小时数,这个是天数。投机取巧365天,这个是年数。对吧,好,CTRL加V得到一个age long啊,但是这个long类型的对吧?啊,这个就得到一个age吧,假如说这叫H啊好,那接下来呢,这个long呢,我们用它,因为我们可以调这个函数,我们就简单一点啊,这个大家知道一下就行了,无所谓啊,All the wide.set这个use age,对吧。
23:03
Use age是一个in类型,所以呢,我们用age点。In。对吧,啊用in value啊啊,当然强转成in的,这样的方式强占in的也可以啊好。这个就搞定了啊,当然这块呢,你不用操心,他是怎么做的啊,无所谓,呃,你网上搜说生日转化为年龄比较多,这个方案呢比较多对吧?好做完之后呢,等会我们做一个测试啊,那就是mind with这个user ds.print。对吧,好,然后这个地方把它拿过来叫white with us,这个是打印测试。好吧,这个东西呢,就。搞定了啊就搞定了,对吧。
我来说两句