00:00
呃,其实上午呢,咱们讲东西例容不多啊,啊之所以讲的这个进度这慢是因为什么呢?就因为以前大家啊和咱们这个前面讲的不一样对吧?原来钱这东西呢,咱们都接触过对吧?那可能呢,就是我的业务稍微复杂一点,但这块呢,咱们以前从来没有接触过这个东西对吧,所以说呢,大家呢,慢慢去把这个消化吸收对吧,就像咱们现在整个啊,再去编写我们这个四分步的项目的时候,对吧,我是个循序渐进的过程对吧,哎,我说我要分层三层对吧,最早的时候咱们其实就一层对吧,先有个controller,然后接下来对吧,在下个学的时候呢,咱们加进service对吧,然后这次呢,咱们又把我们这个map呢,对吧,给它加进来对吧,给加进来,那么具体咱们上午都做了哪些事呢?咱们来看一下对吧,说我们现在啊,其实已经完成了啊这么几步操作,第一个我们呢,已经把订单还有订单明细。
01:00
对吧,他们两个呀,对吧,这个这这个零对吧,给他照在一起了啊,合在一块了,然后呢,并且做出我十傅均摊啊结果现在对吧,每一个订单明细对吧,它分担多少金额,这已经算完了对吧,然后接着再往下走的话呢,那我们给他进入我们的一个可house对吧,也是一个因于我们的OAP对吧,这样的一个分析引擎,那我现在要干什么呢?我要把我形成啊这个订单的一个宽表给我们现在click house呀,保存过去啊,就相当于我现在要把我这个数据保存到我们这个令号这个数据库里面来,对吧,那么如果要往这里来保存呢,那咱们这里呀,我们是使用什么方式对吧?那我们呢,是先把我们这个啊这个stream给转换成RDD啊,把这个线给转成RDD,然后接下来呢,那么咱们呢,去把我们这个RDD给转换成did frame。是吧,然后呢,咱们利用我们did frame它里面的一个right方法对吧,来进行我们的一个保存,那么到底保存哪呢?咱们可以调成JDBC是吧,来指定啊,我现在要保存的一个我们的数据源对吧,是的是吧,那么我们在这里是吧,具体的代码是这样的是吧?首先呢,创建我们Spark session对吧这样对象,然后接下来那么这块呢,咱们去做一个我们这个转换啊,在这里咱要做一个转换啊吧,那么转换之后呢,那咱们啊把它去做一个保存是吧?注意啊,这会呢,上午提的,从这看大家呢,对我们的SPA circleq这块东西是吧,基本上对吧,这个忘忘挺多了对吧,所以说大家下去呢,可以把这块内容呢稍微看一看啊,现在我估计啊,就从问了大家几次,现在停留在哪了,我SPA搜口都哪些对吧?有这个RDD有电frame,有电赛,他们之间的关系是什么对吧,大家都记得很清楚对吧,然后好像再说。
02:56
呃,这个再再多一点对吧,就就不太好了,对吧,那你想比如说怎么去吧,这个创建是吧,这个data frame啊吧,怎么样去把这个数据给写出去,对耐心对吧,这个方式对吧,那这块呢,大家可以稍微去回去看一眼,老师可以看一眼,然后另外一个呢,那么还有一个问题啊,就是这里是吧,这里有问题。
03:18
这里什么呢?就是咱们上午其实我们对一开始犯了一个特别低的错误,对咱们在保存的时候,我本来是不是应该把我们这个呃,做完实物分摊之后,这个流啊给他写到我们这个,呃,这个隔离号去啊,但是呢,咱们这里我后来就写了一个我们order外,就把双join的这个结果给写进去了呀,对吧,那你想你双join之后,他肯定没有咱们分摊金额嘛,对吧,后来咱们在写这个S的时候啊,我们发现这个问题了,对吧,发现这问题之后呢,那回来一看,诶我们就调说这这怎没数据呢,对吧,那我说第一个问题呢,我说这里有个缓存对吧,但是后来说这个东西呢,这个缓存呢,不是是吧,所以说老师这个咱们没写,后来大家想一想,其实如果说啊,你这个东西写错的话,那就算是我这个东西上面做一个打印输出,那么下边呢,那你这个东西也应该执行才对,对吧,但是我们啊,后来把这个东西我们对吧打印输出了,但是我发现对吧,那么他其实在执行的时候,它的保存数是多少,是零对不对,那说明什么呀。
04:18
那说明我现在呢,在咱们这个处理的时候,对吧,如果这个行动算子一旦被触发啊,一旦这个行动算子被触发,那么它后边的东西呢,那这块对吧,那咱们就对执行不了,其实这个东西很好理解同学们对吧?这东西很好理解对吧?呃,那么这个东西我说啊就实相当于什么,相当于这个东西呢,被消费过了,对中有些同学问我说老师这个被消费了去怎么去理解,大家想一想,一说咱们这消费那在什么地方听过什么,就是卡法上听过呀,对吧?注意这种情况呢,其实我们出现他也只是在哪,只是在卡卡数据源会出现,如果别的数据源那不会有这样的情况,对吧?会有这样情况对吧?那么什么意思呢?说我现在啊,在这里同学们,假如说我现在要从我们的卡卡读数去,对吧,卡卡里边对吧,这里边有一个主题,这个主题呢,叫topic a啊叫topic a,然后接下来这主题里边啊,有0123这么几个分区,对吧,那么咱们。
05:18
在读的时候,那首先咱们是不是得看一看,我从咱们当前这个分区的哪一个位置开始读啊,对吧,咱们把叫获取偏移量吧,对,比如说我知道啊,从咱零二分区里头的十位置开始读,这个呢,从十一开始读,这个呢,从18开始读,这个呢从咱二十一开始读,假如说是这样对吧?那么当你现在呢,再去执行的时候,对吧,当你现在呢,再去我们执行的时候,对吧?那么这里假如说你现在触发了一次行动算子,那么是不是说咱们现在你从这读的数据,你已经做了一个操作了呀,对吧?那么如果再去做的话,再去出发行动算子的话,同学们,那你想一想,他们以前对我们这个RDD的理解是什么?等于RD里边它不存放我们现在这个什么呀,它不存放我们的具体数据,它存放计算逻辑,这话没错,同学们对吧?那计算逻辑是什么呢?计算逻辑我是不是要从我当前那个卡卡里边再来读数据呀,但是大家想一想,我要是从卡卡读数据的话,我还会从原来的篇章开始。
06:18
什么不会了,同学们,因为他认为你当前这次操作,你已经把这些东西给我消费掉了啊,你为这东西给我消费掉了,所以说他从我现在的消费过的偏掉开始读,为什么?因为咱们在这后边同学们你想一想,你是不是已经把咱们这个outside range啊,你是不是已经把我们现在这个outside range你是不是已经拿到了呀,对吧,你现在已经读到了哪个分区是哪个位置,它起始多少接入多少,你已经拿到了,对吧,所以说呢,他不再会从头开始读,那这个时候呢,对吧?诶他就会有问题,那么一般呢,咱们有一个良好的习惯什么呢?如果你的数据来源是卡不卡的话。注意啊,注意听同学们这其实是个坑,同学们如果你的数据来源是卡不卡吧,对吧?那么你在程序执行的过程中,如果要做分叉处理,那么这个时候你应该把它做一次缓存啊在这里啊就是我现在啊,我现在在这里是吧,什么呢?说如果程序的来源啊,注意如果程序的来源对吧,是我们这个卡卡啊程序数据来源吧,对吧,程序数据的来源是卡不卡对吧?那么在进行我们这个分叉对吧?处理的时候啊,处理的时候对吧?那么应该啊进行我们这个缓存短接缓存分叉处理,怎么来理解同学们,就是我们这个行动算子呀,被触发啊,行动算子被我们这触发到这个时候啊出发的时候,那这个呢,同学们对吧,这个有的时候呢,你们在下去做的时候可能会啊,这个发现一个比较奇怪的现象,对吧,所以这个。
07:56
他到底说我现在这个执行的时候行不行呢?那么他拼人品,对有的时候你我说我现在啊在这里啊,我这个我我在执行的时候,我发现只管现在我在咱们卡普卡里,我数据来源是卡卡,但是呢,我执行了多次行动上的出发,好像也这个数据也没丢啊也有啊对吧,那是怎么回事对吧,一般情况下,如果说咱们呢,没有做双流照,如果要单流的话,那么这个时候它本身呢,有一些情况会对我这个情况,这个对什么呢?对咱们的数据进行缓存,对吧,就像咱们在讲我们这个RDD的时候,对吧,在讲SPA的时候,对吧,它本身会对什么reduce by key啊对吧,什么一些操作是不是也会进行一缓存呀,对吧,它会自动进行K对吧,它进自动进行开,那么这块呢,也是对吧,这就是为什么说,假如说同学们你可以去测试一下,说以前呢,咱们在这里,同学们在我们这个order啊,Info BP里边,那么咱们呢的数据来源,那也是我们这卡夫卡对吧,但是呢,你。
08:56
你看我原来我在这加缓存,这个缓存呢,其实就是优化的作用,你不加后边这个东西,它也能够去执行,它也能够拿到数据,你看我上面是不是已经把这个东西不了,对吧?你就算是在这里,你要不加这catch,那么同样这RD的数据呢,他也可以拿到,对吧,为什么对吧?这里边其实呢,它给你做这一个缓存,但是如果要是双流的话,对吧,基本上对吧,这个不会给缓存对吧?但是这个东西到底缓存机制是什么对吧?这个和可环境有关系是吧,因为原来就是什么一样的代码对吧,就是假如说在咱们这个别的班有一样代码,然后有的学生呢,也是对吧,哎,我这执行没问题,我不加catch,然后我这呢我就可以对吧,就有的时我在上课演示的时候也这样,对,有时候我现在我不加catch,对也可以跑过去啊,有的时候这个加开不行,所以说咱们现在就怎么样了,对吧,你要记住如果程序值处理来源是我们这个卡不卡,那么如果说你进行分叉处理的时候,对吧,或者说我在这写的更。
09:56
更专业点是吧,如果说对你的程序来源卡不卡对吧?那么在程序中啊,在程序中啊,如果触发多次咱们这个行动操作啊,触发多次咱们这行动操作是吧,那么应该对数据呢来进行缓存,其实这是一个好的习惯是吧,这其实是一个好的习惯,对吧?那么咱们上午这个问题出在哪了呢?对吧,就是我现在在咱们这里对吧,给大家说的,所以你看我现在这本身呢,数据来源是卡不卡对吧,数据来源卡不卡,然后接下来那我现在呢,如果去普认的话,相当于行动算子被触发了,那我再去执行的话,这个数据呢,对吧,它就相当于就已经被消费过了嘛,对,就消费过了,其实注意啊,同学们这块呢,不光是它对吧,不光是我们这个Spark circle对吧,其实呢,你可以试一试啊,就是别的啊,如果说我现在这里在执行。
10:56
别的这个其实你看这里,这是一次我们这个行动算子,这个呢是一次行动算子对吧,那么咱们这里呢,是把它转化成我们SPA circle了,对吧,其实呢,就不光是发搜口,如果说你要是别的操作的话,其实对吧,如果说要是双流,咱们也是大部分会出现我们现在什么呀,也会出现我这数据丢失情况的,对吧?所以说呢,大家尽量对吧,如果你要做的话怎么办?在这里啊,假如说你上边把这些东西包括输出了,然后你现在呢,又想着在下边再进行分叉,那怎么办,在这里cat一下。
11:28
啊,在这里看一下。那如果catch一下,那想想你执行完之后,我现在是不是相当于把这个stream东西我给他保存内存给做了缓存呀,对吧?那么这个时候咱们现在呢,再去执行我们这个行动算子的时候,那么他的RD数据他还去从头拿吗?还是从卡卡拿吗?不从卡卡拿了,是从内存里边来获取的呀,对吧?诶这个呢,要注意一下啊,这个要注一下,好,这是关于咱们上五段这块的问题,然后接下来,那么咱们呢,把它保存完clean clean house之后啊,把它保存到我们0CLEAN house之后,那咱们接下来干什么呢?
12:05
是吧,在这里我们啊就开始对去发布我们的接口啊,开始去发布接口是吧?那么如果发布接口的话,我们这个代码呢,它还是对写在了我们现在publisher把这个里边啊,我把这个注释掉了啊,那么咱现在呢,还是把它写在我这个publish里边,对吧?那么在咱们的publish里边啊,那我们主要编写的是哪层代码呢?对吧,我说现在呢,我是三层对吧,一个是我们这个控制层,一个是业务层,还有一个是我们这个对吧,持务层,或者咱们这map,对结合我们现在买白这是map,那么上午咱们主要呢,是把我们这个map里的代码给写出来了,对吧?那么咱们要写map,那么首先呢,咱们在这里对吧,我们啊要去把这个数据啊,要对我们这可号进行操作,咱们首先呢,在那里有一个配置文件,在配置文件里边,我们配置了对可林号连接它的一些什么驱动啊,URL啊这些内容,然后接下来咱们指定了。
13:05
啊来be映射文件的路径以及呢,咱们这个对象是它的一个我们的一个属性是吧?它的同分命法和咱们数据库啊,它的下划线,它们之间一个关系对吧?然后接下来咱们呢,在这里创建了一个接口,注意啊,如果是买be底的话,它呢,在处理我们这个啊这个资产改善业务的时候,对吧?他和咱们原来的逻辑不太一样了,原来的逻辑是什么?原来逻辑是我现在有一个接口,那么实现内得自己写对吧?现在不需要对吧,你只要不提供接口就行,那么接口果提供了,那么这个时限类交给谁呢?它会通过反射来自动帮你生成啊,来自动帮你生成买be会做这个事儿,对吧?那么它怎么和咱接口给对应起来呢?那每个接口它都有一个对应的映射文件,这个映射文件对吧,那么它的位置咱们在配置文件里边来指定了,我们放在了map,然后下边,然后所有新的插标文件,结尾的就是我映射文件,那我怎么知道?
14:05
你当前的映射文件是哪个接口映射文件呢?那咱们这里是不是有匹配关系啊?在我们的映射文件中有一个map这样的标签,在map标签里边有一个name SP属性,那么这个name SP属性它的取值应该和接口它的一个权限地名保持一致啊。什么叫权限地名?就是包名加类名的形式。对吧?然后接下来,那我接口里边有很多抽象方法,那么这个抽象方法到底要完成什么样的业务呢?那么咱们说在这里啊,那么你有些有一些增加改查的标签,那么这个标签的ID和我们结果中方法的名字呀,要保持一致,然后接下来我们说作为一个方法来讲,我比较关心的是参数,对吧,然后呢,返回的类型,以及咱们具体它执行的语句,对吧?那么我们现在呢,这里如果说是生语句的话,咱们直接写在我标签题里边啊,直接写在标签题里边啊,这是最后语句,那么如果说咱们现在呢,在这同学们对吧,那我现在除了这个之外,对吧,那还有什么呢?对吧?
15:10
这往稍微往这挪一挪是吧。对,那么咱们现在除了我们这个之外,那还有什么呢?对吧?那这里还有一个我的返回类型,那么返回之型呢,我给大家介绍两个属性,一个叫result type,一个叫map,那么如果说啊,我现在这个法律类型比较明确,那这个时候你可以直接用result type,一般是单个值的时候,你可以来指定的,那如果说我现在返回类型呢,稍微复杂一点,那么这个时候呢,你可以通过result mapb来自己定义一个我们这个具体类型,对吧?那这个的名字随意的,然后呢,我通过result map标签来给它设置,那现在你在这里呢,设置一下你当前类型是什么,对吧?我在这里啊,我之所以把这个map给拿过来,对,我是因为什么呢?咱们现在呢,我查询的结果应该是这样的,这个呢,是从我们这个house它的表里边来查对吧?那表的结构什么呢?上面应该有咱们列名对吧?然后这个呢是列二,然后下面呢,是我们具体的每列对应的值,每列对应的值,那我希望什么呀?我希望你再给我返回的时候,对吧?你返回的是我当前列名。
16:14
然后呢,这个列值它的对应关系,然后把这个给我封装到一个我们的对象里边去,等封装到力呢,封装到一个map部集合上去,那如果这样的话,同学我的mapb集合的结构那应该是什么样的呢?比如说我现在呢,这是一个mapb集合,Mapb集合它本身呢,是不是应该KV的结构啊,对吧?那么K咱们这里是不是应该有一个HR代表小时,然后V呢,代表是当前,比如说11点咱产生数据,这是我当前map部集合第一个咱们见啊第一条记录,那么除了这个之外呢,那我现在这里是不是还有第二个我们列,第二列什么呢?第二个列是我们的amount am,然后接下来它可能比如说点击量多少呢?啊比比如说我现在这个交易额多少呢?比如说1万到1万,那应该这样形式这个卖吧,它代表的是一条记录啊,现在给咱封装的这种形式啊,现在他给咱们封装这种形式,对我家auto mapping其实属先的目的就是让他来帮我自动的对吧,把它。
17:14
咱们我这个列名和谁呢?和咱们列的值给它映射成我们一个map部集合啊映射map部集合,Map集合它这个结构是这样啊,Map集结构是这样,好,那咱们现在呢,那在这里把这个map啊,咱们这一层就这个映射文件写完了,那我说如果说我现在s spring步的程序对吧?那么咱们现在要要执行找到我们这个接口和映射文件对应关系,那么这个时候呢,你必须得在启动类上是不是得加个东西啊,是不是又叫做wi sc对吧,就是我在程序启动的时候,他呢,就去扫描我们接口所在的包对吧?然后找到接口,然后接口找谁呢?接口找到咱们现在配置件对吧,这个映射文件所在的这个路径,然后呢,根据我们现在这个映射文件里边,它这个内space,然后让接口和它建立关系,对吧?然后我们另买be的框架,它会根据我当前的标签的配置对吧,来帮你去生成我们这个方法对吧?其实说老师这个东西有接口,难道没有类吗?其实有类,只不过这个东。
18:14
题呢,不用你写了啊,不用你写了啊,这就是咱们的框架啊,它的一个作用框架作用好了,这是咱们上午内容把这块呢,我稍微停一下。
我来说两句