00:00
那么再优化的话呢,那咱们现在呢,来把这个呢,我就给租掉了啊对读掉了。这个是我的5.2啊,然后呢是方案二,这个方案二呢,那我现在呢,那不以分区为单位对吧?那如果不以分区为单位是比它还要优对吧?那你说还能优化到哪去呢?大家想想咱们现在在和我们这个啊,这个HB的表进行关联的时候啊,到目前为止,我现在这个讲的是不是第三种方案,第一种方案是什么?是不是一条这个一条记录对吧?这个是我现在啊,这是里边啊可以什么一条记录对一条记录,然后呢,咱们拼接一个circle口,然后呢进行查询,这是第一种方案,然后说这不好对吧?那怎么办呢?咱把分区数据拿过来啊,把咱们这个分区数据拿过来,然后接下来把分区内的所有数据,然后是拼借一个搜口,那再查一圈啊对吧,那你说还可以再优比分区再大一点是啥?就是我现在在咱们SPA区。
01:15
区里边比分区这个数据还要再大一点的是什么?RD是吧,那么咱们现在这个RDD,我在Spark里边,咱们操作是RDD吗。不是吧,咱们是不是操作离散化流啊,对吧?那么离散化流的话,大家想一想,什么叫离散化流,是不是在咱们一个采集周期里边采集的数据,咱们封装了一个DS对象,所以说咱们现在呢,可以再来一次什么呢?对吧?以采集周期对吧,为单位来对我数据进行处理,这块呢,就是我现在第二种方案对吧?它要使用这个事对吧?以采集周期啊,以采集周期啊为单位对数据进行处理,然后呢,把咱们当前这个采集周期的所有的数据,然后呢,动了一个缩口,对吧?或者说咱们现在呢,在咱们这里边,呃,对于我们一些小表数据的话,大家想一想,我能不能这样呢?比如说啊,像我们这个省份,这个省份数据的比较有有有特点啊,像这种维度表的特点是不说不是数据量不大呀,都比较小,是不是你说我现在呢,在这里能不能这样说,你现。
02:29
在啊,比如说我一个采集周期五秒的数据过来了,对吧,那我现在呢,在查询的时候,你不用啊这么费劲把五秒钟所有对那个省份的这个ID给我查出来,对吧,你可能五秒钟我一看省份多少个,比如说32个,对吧,但我一共省省份多少个,比如说34个,那你说我现在你本身你要查32个,然后实际是34个,你说我还有必要再去过滤一下吗?是没必要,我直接都查过去给你得了呗。对,我直接都查过来给你不就行了吗?对吧,然后到时候你再用的时候,然后你能根据我现在的这个首付的ID拿来获取对象就行了呗,所以说啊,那我现在想这样以采集周期为单位来对我数据呢进行处理,那么这个时候呢,咱们以凭行circle口,这个circle口呢,是吧,那咱们可以这样附加条件了,通过S口,然后将我们这个所有的省份查询出来啊,将咱们所有的省份给查询出来。
03:25
对吧,哎,那咱们如果想这么实现的话,那这个东西呢,那咱们看代码怎么写。首先大家想一想啊,那么你要想以采集周期为单位的话,那么这个时候呢,对吧,那你操作的肯定不是我们一个分区,所以说没有什么卖part这个事儿了,比分局再大一点,咱们刚才说了同学想到RDD对吧,那你要想拿到RDD的话,那么咱们是不是得通过我们地推来进行转换呀,所以说呢,这个时候需要一个转换算子啊,那么我现在呢,就来到这里对吧,找到我们上面这个啊这个流。
04:00
然后接下来咱们现在呢,去调它的一个转化算子transform,那么通过transform呢,可以拿到我这个RD啊,可以拿到RD,然后接下来那么咱们在呢,拿到案D之后,那最后呢,我把这案D呢给他返回过去,对吧?那现在呢,咱们暂时先把这个东西呢给拿过来啊给拿过来,那接下来那我曾经呢给大家介绍过,说呀,以前你们可能听过这句话,说什么呢?说算子相关的代码,把算子这个之内的代码在什么is执行,然后算子Y代码呢在咱这执行,但是有两个东西它是特殊的,一个是咱们transform,那另外一个谁呢,是咱们的forr DD啊对吧,那么咱们现在在这里,我现在要是写的话,注意同学们这个东西,它其实这个RDD这块代码它是在哪执行的呢?它其实在咱这转执行的啊,因为你操作现在还是RDB呢,对吧,你这这在这这里的代码,它在折二端执行的对吧,那么在折二端执行你要干什么呢?我现在这样对吧,我现在在咱们这里边我。
05:00
我要从菲尼克斯州啊,从那菲尼克斯中来查询啊,所有的我们这个省份数据出来啊,要查询所有的省份数据啊,省份数据,那如果你要查询所有省份数据,那这个时候你也得去定一个circle口,对吧,然后呢,这个简单的我直接从上面复制对吧?我这个直接从上面复制。CTRLC把这些东西拿过来好了,那接下来咱们现在呢,可以什么呀?可以通过我们的菲YouTube,然后调它的一个快方法,然后呢,把咱们现在这个数据啊给查询出来,查询之后呢,得到的是一个pro,呃,这个in forest是不是把所有省份的集合给拿到了呀,对吧?那么一样的道理,同学们拿到所有省份的集合,咱们现在在这里是不是得对我这个RD数据做一个便利呀,对吧?那么你现在呢,再去处理的时候,同学们,那么这块呢,咱们要想处理它的话,是不是还得和刚才一样,你得给做一个转换呀,你得把这个例子转化成一个map,对吧?那么怎么转换呢?那么咱们先把它转化成KV的形式,那直接在这里去调它的一个map这样的一个算子,做一个映射对吧,然后接下来你给我拿到的是province,然后呢,这个应该是Jason object,对,我现在给我反。
06:25
返回的这个集合里边放的是一个一个的省份的接合对象,那我现在呢,要把它转换干什么呢?首先是不是得把它转换成这个省份对象对吧?将我们的杰森对象来转换为咱们这个省份对吧?样地类对象啊,样的对象对吧?那么这里有一个方法Jason对吧?这Jason里边有一个方法叫什么to Java object对吧?然后咱们现在呢,可以把谁呢?可以把我现在是Jason对吧,Province杰son拿过来。然后接下来传一个class offf,对吧?那么这个呢,要放的是我的promise,把这个导一下,那么导完之后呢,咱们点二我们这个VR拿到的是vince in for这个对象,然后接下来咱们呢,给它返回,那返回什么呢?这里两个内容,一个是provice inform,点这个ID,那么另外一个是VI inform对象本身正然接下来咱们把它转换成我们这map部集合,点2VR一下,那这样的话咱们就可以拿到proce in方map pro方map同学们,其实这个思路和咱刚才是一样的,只不过他写的地方不太一样。
07:39
对吧,他写的地方不太一样,这个东西咱现在写在哪了?是不是写在我这个的driver端了,对吧?那么他什么时候去执行这一次了,其实你想一想这个数据它是不是相当处于整个咱们批次的数据啊,对吧?它整个采集周期的数据转换了一个RDD,然后呢,咱们每一个采集周期来执行一次对吧?来这一次,然后接下来,那么你把这个代码写完之后呢,那没完事了,对吧?那你肯定得对我们这个里边数据来进行处理呀,那么如果对数据进行处理的话,那么这个时候咱们可以通到通过它的什么呢?通过它的一个for把RD的数据呢,来做一个遍历,对吧?通过for把RD的数据呢,来做一个我的遍历,对吧?那么咱们现在在便历的时候呢,其实对吧,这个东西,那咱们其实把这数据打出来啊,把这个RD数据打拿出来对吧,那这块大家注意啊,其实我们现在这里边我是更更更重要的是什么呀,我是不是如果封闭的话,就相当于把这个东西给他提交了呀,但其实我现在是不想把。
08:39
你给它转换一下,所以说呢,那咱们现在r DD map这个可以对吧,那你现在如果map的话,你拿到的是什么呢?我拿到的应该是一个order in phone,对我拿的是一个order in inform,然后接下来,那么你要这个拿到这个之后,你要这个做一个什么样处理呢?咱们是不是开始对吧,做一个我们这个判断呀,对吧,做一个判断什么呢?我现在啊要从这里面来取数据,怎么取咱们这个map里边对吧,我去掉这1GET else的方法,然后把咱们order in for.provi ID对这个参数给传过去,对到这里呢,需要转换一下,说它转换成我的two string对吧,然后接下来如果要是没有的话,咱就给它这个这个返回到对吧,点V2,那么这个时候拿到的什么,拿到是provice对一这样的对象,那么如果说我现在啊,从这里没有拿到省份的话,你的数据肯定出问题了,对吧,所以说咱们在这呢,要不要要要等于扣的话,其实就是一个我。
09:39
我们这个程序严整性的一个,我们这个判断,对,其实你这个不做判断的话,应该也没问题,因为你想一想,我把所有省份都拿过来了,然后你当前订单的这个省份ID拿着到咱们省份所有省份里去查没查到这种情况,你想一想是不是你的数据肯定是出问题的是对吧,所以说我这种其实可以不加啊,加的话呢,也是为了让我这程序更健壮一点,然后接着如果他不等于空的话,那么这个时候说明啊,那么咱现在有这个数据了,那有这个数据,那你要干什么是不是,其实就是把咱们现在这个赋值操作拿过来对吧,其实呢,就是把咱们这个赋值操作呀拿过来,再赋一下值,对吧?把这个赋值操作拿过来再赋一下值好了,那这样的话,它返回什么呢?它执行完毕之后,V2它返回的是一个new r DD吧,那咱们现在是不是应该把这个new RD给它返回去啊,其实或者说这样,咱们本身这个东西执行的时候,你不写返回值,因为我这个map本身是不是是一个转转换算子呀,这个转换算子它返回结果是不是就是一个RDD呀,对吧,所以说你这么直接。
10:39
这也可以啊,这直也可以。看一下啊,那么咱们现在呢,来对我这个程序呢,来做一个我们这个是吧,这个抽取VR。那么这个返回到还不行,为它返回赋值的话,这还给它返回一个对吧,因为它直接赋值了对吧,那咱现在呢,在这里我VR一下对吧,那么它本身呢,在咱们这个RDD里边,它放的是这个东西,这不行吧,咱们其实在这里应该给它返回一个内容,对吧,Order INF inform,然后最后呢,返回的也是order in for对吧,这个应该是可以了,然后点V对吧,那这里呢,应该是order in对吧,咱们现在这个叫什么名字呢?和上面名字一样就行,对吧,Order in with the pro stream啊然后咱们看一看啊,能不能够实现我们现在呢,它的一个省份关联的效果,把这个打印一下啊把它打印一下,这个呢不用变,然后咱们现在只需要把当前这个程序给重新启一下就行,来重启。
11:51
然后来到这儿呢,咱们去运行一下啊,我先出一些数据,看一看能不能把这个省份给我关联上,在咱们这里。
12:05
来,大家看看咱们的手问。是不是还是可以过来的呀,对吧,大家看咱这省份其实是不是还是过来的呀,对吧,所以说呢,目前呢,这种方式呢,也还行也还行,但是呢,这种方式呢,还可以再优化,同学们。这种方式呢,还可以再优化。再优化是什么呢?就是大家想一想,本身像我这些东西它是在哪,它是不是在我们这个JA端创建的,就这个东西它本身是不是在咱JA端创建的,然后当你去调用rd.map的时候,这个map这里边这些操作它是在哪执行的,是不是在到ex执行的呀?那每一个ex control它是不是都要访问我现在这个mapb集合,对吧?那么它默认的处理方式什么样的呢?咱们现在在一个is code是不是要运行多个task,一个ex说运行多个task,那每一个task里边是不是都会有咱们这一份map它的一个副本,每一份task都会有一个map的副本,那大家想想对咱们exq它的压力是不是比较大呀,对吧?所以说咱们现在这个时候是不是可以优化一下,怎么优化呢?把这个东西转变成广播变量吧,那么如果转变成广播变量的话,它是怎么优化的,不是每一个TASK1份咱副本的,而是每一个ex是不是有一份副本就够了呀,对吧?所以说咱们现在可以把它给它转换成广播变量。
13:27
这个广播变量怎么用呢?同学们怎么转换,怎么创建广播变量?点什么对,我现在大家想一想,我现在有谁,我现在是不是有SSC,但但是你们讲广播变量的时候应该是么?是不是有SPA context呀,对吧?所以说咱首先第一件事你得干什么呢?它有一个SPA contest,把它拿到,拿到它之后呢,咱们现在这里有个叫broadcast,然后把谁传进去呢?把咱们现在这个map给它传过去对吧,那把它传去之后呢,咱这个变量,那这个呢,其实就是我们这个broadcast对吧,Map啊broadcat map,然后呢,你在使用广播变量的时候注意啊,咱们在这里让我们定义省份的广播变量,对吧?然后接下来,那么咱们现在获取的时候,对吧,那么这个时候你是不是应该通过广播变量来获取啊,怎么来获取呢?它点我们这个value吧,对吧,它点value对吧,就是你要想用的话,那封装一个网变量,在使用广变量的时候呢,那你通过它点value来进行获取,对吧,通过他点value获取对吧,那这样的话呢,咱们在使用的时候。
14:40
哎呀,那其实呢,它是有优化在里边的,对吧,大家想一想,同样啊,就是咱们现在要想实现关联的功能,对吧,很多种方式对吧,很多种方式,而且咱们天天说什么优化优化优化对吧,就是咱们可能在你写代码的时候,对吧,你用哪种方式你可能都感觉不到的。对吧,比如说你看我现在我给大家介绍三种方式到一条条去处理,然后呢,咱们现在以分区为单位进行处理,然后呢,咱们现在是我们以采集周期为单位进行处理,并且不装广告变量,对吧?那么我现在在写的时候,你可能啊,哪种方式你都感觉不到,说这个性能有多优多优多有多对吧,但如果说对吧,咱们在写代码的时候,你要一条条处理的话,要给您的有些公司他会做代码review的,对吧,一看我去这个的确是大数据程序员啊,写完代码就是不能看是不是对吧?所以说呢,这块呢,你要注意一下,其实这个是一个优化的过程,对优化的过程,但是我们当时在讲广告变量的时候,同学们,对吧,你说这两种方式哪个更好,就以分区为单位进行处理好啊,还是这个广播变量这种方式好,你觉得哪种方式更好,你们觉得哪种方式更好一点。
15:53
不一定是吧,那什么什么情况下,咱们现在广东变量这种方式好的。
16:00
有的人说大,有的时候说小,不大不小是吧,注意啊,看一看你们的环境。看一看你们的环境,如果说啊,咱们现在大家想一想,如果说我以分区为单位的话,虽然说没有说我一个分区呢,咱们拼接一次,咱们C口执行多次,但是呢,大家想一想,我这个数据它是在哪处理呢?如果以分区为单位的话,咱们这个数据是不是直接就在我们的exq去处理了,咱们在我们这个driver端,它有存这个数据吗?根本就没存对吧?所以说如果说你的这个环境里边,然后你的driver啊,它的一个性能比较优,对吧,你可以承受这样内存,但没关系。对吧,你可以把它抽取成广播变量在driver里边,但如果说你的driver资源就比较紧张的话,同学们,那我觉得这种方式是不是也不错呀,对,我就不需要在driver里面再定义我的广播变量了,对吧?所有的数据呢,它都在AQ进行处理,是不是也行啊,对吧?比如说我们现在呢,要关联两个东西,一个谁呢?一个是我们这个用户,一个呢是省份,那么省份数据其实呢,这个不大对吧,那咱们现在这个东西我是不是可以把它放到我的driver这边来,对吧?然后呢,如果用户的话,这个东西数据是不是比较大了呀?对吧?如果你Java能扛得住,那没关系,对吧,那你可以把它放Java端,对吧?那如果说我现在Java扛不住的话,那这个东西那也不太合适了,对吧,你直接就是咱们卖part,你分区为单位进行处理就行,对吧,可能和大家前面理解的不太一样,前面大家理解的应该什么广播大变量对吧,说我现在如果这个东西这这个比较大的话,那我应该使用广播变量,你使用广播大变量的话,你减少的是谁的内存,同学们你节省的是S内存。
17:47
对吧,就是你使用广告变量之后,你是不是AQ内存少呀,但是我如果让我选用不用广播变量的话,那你是不是要考虑一下咱们现在我的driver端,它的一个内存情况是怎么样的,对吧?所以说这会呢,你要想明白,把这个想明白完了,咱们最后呢,在这做一个测试啊,看一看我现在这种方式行不行。
18:18
来看一下能不能够把咱们这个现在的社会数据关联进来。好了,大家看这个省份数据是不是也过来了,对吧,省份然后呢,它的一个我们的地区以及国际编码,对吧,这是可以的,好,那这样的话呢,关于我们现在啊,这个订单和省份的关联,咱就做到这儿填一下。
我来说两句