00:01
OK啊来下面我们什么通过这个代码把它实现出来啊好,那首先呃,我们要从这个地方,我们就是去读了哈,就从你的这个ready去读它就可以了吧,所以说你看啊,我上来以后呢,那我怎么写呀。啊,怎么写啊,那我肯定就不这么写了吧,那我叫什么,先去把你的key给他拿出来啊,我们定一下这个key啊,叫就叫什么factor kiss吧。好,RA中的这个factor叫K4啊好,这是我们刚刚分析到的,就就用它就可以了啊,叫factor tables啊行,再来定一个啊,叫red的一个dim的K4啊,对吧,就叫这个Di tables啊行,那这个有了以后呢,下面我们就要去拿你的链接了啊来看一下,我先把代码写出来啊,大家再来分析它好不好。Get get,好,讲这个VR我们叫这个je啊行,那拿到以后呢,下面就去读呗,怎么读呢,就是je点叫什么呀,叫s members对吧,把你的这个red的叫factor kiss翻过来,这个读到的其实就是我们的一个factor。
01:13
Table斯了,能理解吧,同样再来写一个啊讲s members,好,这里面我们写一个叫什的,叫做Di case啊行,这个拿到就是我们的dim,然后呢叫dim这个tables对吧,一个是你的实值表,一个是你的这个维度表。好,那这个有了以后的话,那你看这个东西我就可以不要了呀。对吧,这是我的什么呀?来注释写上啊,这是我的事实清单表。这是我的维度。哎,维度清单表。能看到吧,好,最后的话,你这个加斯用完以后呢,你把它关掉啊,好这就OK了。对吧,就是从你的里面去读一下就可以了,好,那你说我这个代码写好以后,现在我这个代码写到这以后行不行啊。
02:01
行不行,同学们。来这样哈。我给他做一个输出。对吧,这也做一个输出啊,OK,你看了啊,接下来我把这个程序跑起来。呃,首先我现在我的肯定是没有这个东西的啊,那他肯定读不到。读不到吧,同学们。对吧,读不到的好,然后接下来你就看这个打印啊,看这个打印。他这个打印了几次呀,同学们。打了一次就不再打了呀。这说明什么?说明你代码如果写到这以后呢,它只会执行一次,那你执行一次的话,你怎么去动态的去。进行这个更改的,你比如说啊,你现在不是第一次读成什么都没有吗?来假设说啊,我现在在我的red中,你看了哈,我做一个操作,我叫什么SI的,我就叫这个,呃,他的名字啊,我再看一下这个名字叫啥来着。
03:12
你看啊,我就写一个什么factor。对吧,Tables,我往它里面加一个啊,这是事实表,事实表的话我们叫做order info。能看懂对吧,我加了一个all in for,好来,那我加进去再加一个,加两三个好吧,All details啊,有没有S啊这个。看一下啊,这个表啊,这个不能瞎加啊,这个加对了啊,Order order detail啊,没有S啊。好,来all detail,行行,我加进去以后,你看了s members,我来拿一下什么这个fact tables啊,就是我的writing中的,现在已经有这两个表了,看到了吧,但是你发现我的程序中他读到了吗?它有毒吗?他根本就没读,你能理解我的意思吧,他根本就没读,所以说现在的问题就是你的代码写到这样其实不太好。
04:04
啊,不是不太好,是根本不行,他只有第一次的时候去读了一下,那你说你跟我跟我这个写的有啥区别吗?同学们没啥区别了吧。所以说我们是不是希望他能够这个这个代码能够什么周期性的去执行,就是诶我每隔一段时间我执行一次,每隔一段时间执行一次,每次执行我是不是就可以动态的把你的red里面做了修改的数据再给它读进来了呀。对吧,好,那么如果你要这个周期性执行的话,那你找找吧,这里面哪个地方比较合适啊。哪个地方比较合适?同学们。你看啊,呃,我发到你的这个。放到这里面行不行?可以吧?相当于什么,我每来一条数据,我就先去读一下你这个表。对吧,那这个读取的这个频频率还是比较高的哈,频率还是比较,一条数据我就会读一次,一条数据我就读一次。
05:05
对吧,这个是什么呀,我每一个分区的数据我会去读一次。对不对,每个分区的数据我会读一次。好,然后呢,呃,这个肯定不行啊,这个就是执行一次,现在我们有这个效果啊,那这个呢,这个是我每一个批次的数据,我会读一次。好,那就看你的要求是什么,对吧,如果说呃,你希望你的每条数据都能够去读一次,这样的话你就么更新的会更快一点哈,同学们好,但是呢,也会带来一个问题,就是对red的压力会比较大,因为你实时处理嘛,你来一条数据我就要去读一次,来一条数据我要读一次。对不对啊,这个不太好,而且大家注意哈,我们表的这个修改啊,他也不是说我这个一直在改,对吧,我一会儿改一次,一会儿改一次不是的。他改的这个频率呢,其实也是比较低的,那我就没必要说这个每次呢都去读对吧,没必要说每条去读,也没必要说每个分区都去读。我完全可以什么呀,就一个批次,我读一次就完事了,你来一个批次的数据,我给你去读一次,你来个批次数据,我给你读一次就完事了。
06:05
能明白吧,所以说呢,我们放到什么,放到这里面是比较合适的啊,就放到什么呀,放到你的for r DD的里面,Partition的外面,就这个位置,所以你看了哈,我现在要干嘛呢,我要把我刚刚写的这个代码。这个。好整体拿到什么,拿到这个位置。然后来吧,拿到什么,拿到这个位置了啊好,拿到这个位置以后,来接下来我们重新把这个启动一下。好,那当然哈,启动之前的话这样吧,我为了让你看到这个很好的效果,我先把这个给他干掉啊,先把这个表,先把这个red给他干掉,好没了没了以后来重新启动。重启以后你就来看啊,它这个打印的一个效果啊。行,第一次没读到对吧,我们看看他他还打不打啊,又打了一次吧。
07:03
对吧,他现在就按照你的周期,然后呢去执行了,你每来一个批次的数据,那我就什么帮你读一次,OK,那比如说现在啊,我就到你的ready,然后呢去加东西了,你看啊,我把它加进去,加进去以后你看啊,上个批次没读到。诶,读到了吧。对吧,同样的道理啊,这个维度表我们也加一个啊。维度表。呃。写一下啊,叫dim。Tables对吧,维度表有什么,有这个user info,然后有什么贝完了。这个重新写啊,因为写了个中文啊。我重新写得了啊来这个叫I的啊呃,叫这个Di dim,然后呢,冒号TABLE4啊,我们叫这个user_info然后呢贝promise对吧,我就加两个啊来加进去,加进来以后你看一下啊,这个刚刚还没读到对不对。
08:06
好,下个批次你看是不是都读到了呀。能看到吧,诶这样就实现了一个什么动态的一个配置,就是你想改你就改你的,你的任务是不用停的啊,他也不需要做任何的调整,你只需要打开你的RA,然后呢,把它做一个更改就OK了。明白了吧,哎,做一个更改就OK了啊行好,那么这就是我们的这个,呃,动态配置这个表清单。理解了吧,好,那做到这以后呢,其实这个效果呢,就已经实现了啊呃,当然呢,我们可以什么把它做的更好一点,就是大家,呃,写到这个点的时候呢,你还要。想到另外一个问题,啥问题呢?就这个代码呢,其实是在什么在我的driver端去执行的,那也就说白了,我的这两个对象啊,就这个对象和我的什么这个对象呢,它其实是你driver端的一个对象,那如果你是driver对象的话呢,但是我们将来真正用的时候,你看一下啊,我是在你的for partition里面去使用的,你能看到吗?
09:06
那就说白了,现在我们也涉及到一个driver中的对象,我要传递到你的里面了。明白我的意思吧,同学们啊,我要传到你这个XQ里面了。这个地方会涉及到一个传递,好,那如果说你涉及到一个对象的传递的话,那你首先你要保证的就是它一定能够什么呀,序列化,那你说我是一个集合,我能序列化吗?它必然是可以序列化的。对吧,Collection这个itable,呃,诶这个在哪来着,找找啊,这是u site是吧,Site里面呃,Collection,嗯,找一下那个序列化,它肯定肯定是呃肯定是能够找到的啊这个这个成本没有,那应该就是它在它这个具体的类型上面了啊,这是一个呃util set,那应该是哈希site什么的吧,对吧,我们找他这个具体事项类吧,啊这个是我看看啊。他给你返回的是一个。呃。
10:01
Return了一个什么东西啊,Return了一个这个玩意儿对吧,就你去找吧,他这个具体的那个对象肯定是能够序列化的,如果说他不能够序列化的话,那现在的问题就是它肯定传不过去,对吧?这个site肯定是可以序列化的啊,这我就不给你去找了。OK吧,它肯定能够序列化啊行,那么你能够序列化的话,那说明什么,我从Java端传到你的exq,这个是没有任何问题的,对吧,但是呢能传。就不代表着说这个绝对好了,你还得想另外问题,就是我传的这个数据量大不大。你能明白?如果说我要传递的这两个数据呢,是比较大的。那你就想想吧,我每次给你传,每次给你传这个是不是也会消耗你的一定的什么资源,对吧,比如说你的带宽对吧,你要做L传输对吧,也会有一定的什么性能影响。是不是所以说啊,我们现在我们就要想到另外一个点,什么点呢。大家在Spark学过的东西叫做广播变量。
11:01
对吧,就你代码写到一定程度以后,你就要想到类似的点了啊,广播变量这个玩意儿会干嘛呢?这个玩意儿的话可以帮助我们去节省,就是减少你这个对象的一个传递。这个你们还记不记得啊,同学们,广播变量。就是我现在把它做成广播变量其实会更好一点。因为我可以什么少传几次。啊,有没有印象啊,同学们。这个时间比较久了哈,我不知道你们还记不记得啊,呃,这样吧,我们来这个。简单画个图吧,把这个说一下啊对,既然说到这个点上了,那就把它说清楚一点啊,以后你就把它记住了啊,同学们把它记住啊。像。说一下这个广播变量啊,好,这个啥叫广播变量呢?啊,它的一个定义是叫什么叫共享,共享只读变量对不对?好,它叫这个共享只读变量。
12:02
OK,那就相当于是这个效果啊,比如说现在我们有一个。有一个Java。明白吧,诶有一个Java。好,我把它写到这儿来,我们把它给个颜色吧,比如说这个绿的,好吧,这是我的Java,然后呢,呃,我们还得有什么有这个啊。好,我重新给个颜色啊,比如说这个颜色的啊,这是我的CU啊,呃,这样写吧,这个正好里面我可以画点东西啊。加啊。这边我就不写东西了啊。对吧,我把它放在这儿啊,然后这是我的excu,来我也拿过来啊。
13:00
好,下面也是啊,这个Q对吧?啊,这里面我就不写不写字了啊,把它干掉好,那现在的问题就是这样子的啊,现在的话呢,呃我们呃,我们有一个对象啊,这个对象的话就是叫什么叫这个,比如说我们的叫什么factor。Tables对吧,或者说什么,或者说就是你的那个什么叫做。Dim tables啊。对吧,这个dim这个诶没改改过来啊好DM这个tables那了解这是这是我们要传递两个数据啊,这个数据我就给它这个画成这个黄的。能理解吧,好,那现在我要去传递了啊,它是怎么传的呢?就是默认情况下啊,他这么去传的啊同学们。怎么传的呀,我会按照什么呀,按照你的任务来去做传递,他还不是按照你的ex,它是按照你的任务来去做传递的,就是我们一直聊的就是诶我的一个就是一个并行度,其实不是的。
14:00
啊,其实不是的,应该是你的每一个task,它是一个并行度对吧,那就说白了啊,其实在我的这个每一个CU里面呀,将来我们还会有什么呀,会有这个task。我换一个别的颜色啊,换个蓝的吧,对吧,我们会有什么各个task你能明白吧,这是我的task。啊,那当然这个task呃,可能在同一个里面执行多个啊,也有可能什么在不同的里面,这个就不一定了啊同学们这看你的资源的一个资源的一个情况了,理解吧,好,那假设说啊假设。说现在呀,我总共有四个并行度对吧,那我就有什么四个task,但是呢,我就只有两个excu,那我的四个task就要什么在你的两个excu里面去分配,假如说这哥们资源多,那我分了什么分的这个三个task,这哥们资源少,我分了一个task,好接下来我们要做计算的时候,我要把对象给它往后传递,我是怎么传的,我是这么去传的。
15:05
嗯。好把这个箭头去一下啊。呃,现在我是怎么传的呢?我是这么去传的啊,就是我要把你的这个表啊,我就拿一个表来去说了啊,我要传给他,传给他传给他。两个都上了好吧。好,这也拿过来。好传给他啊,同样呢,还要传给他。OK吧,是这样的一个效果。啊,就是我是什么,我是以你的任务为单位啊,以你的什么task为单位,然后呢,进行这个传递的,并不是以你的这个进行传递的。好,那你想想,如果说我们所传递的这个数据量还是比较大的情况下,那你想想,你的任务越多,那我手上传的次数就会越多。
16:06
对吧,你的这个数据量还比较大。那你传的次数还多,你每传一次,你就要什么开辟网络带宽,然后进行传递,你每传一次就要有网络带宽的一个损耗。是不是说这个呢,就其实不太好了啊,那我们可以去把这个去做优化啊,优化成什么呢?我们把它优化成这个所谓的什么广播变量,就是我把它呢做成这个广播变量,我把它做成广播变量以后呢,我们就可以这么去传了,我是以你的ex为单位进行传递的,就说白了,我现在呢,不给他们进行传递的,你能明白吧。啊,不给他们传了来,这个我先去掉吧,不要了啊,我不给他们做传递了。好干掉啊,就这个就表示没有了啊,表示没有了。好,我就我就在这里面就说明了,这个我就不再去说了啊,我不给他们传了,而是把这个东西啊,我统一传给什么呀,传给我的一个ex。
17:05
能理解吧,然后呢,统一传给他以后呢,我们接下来我们只要干什么事情啊,我们的每一个task呢,我们只需要做这个操作,就是去引用你的这个数据就完事了。明白吧,我就去引用就可以了,我就不用什么呀,诶给每一个task去传了,我就引用一下你的数据,诶就搞定了。啊,大概是这么个意思。能不能理解同学们这样的话,你看看我是不是只需要给你的每一个ex,我传一份就够了,那同样他那边也是一样的,就不给他传了,我就什么给他给这个呢,我也传一份就够了。理解我的意思吧,好说你看啊,当我传过来这一份以后呢,诶,那我的每一个task,每一个task我都是什么呀,去读取它的,当然这个数据是不允许你去改的啊,它叫什么?它叫共享只读变量,啥叫只读呢?就是我只能够去读,就它的每个task,我只能去读这个数据。
18:03
你是不能改的。明白我的意思了吧,啊,这就是你做成广播变量以后呢,它的一个好处。OK吧,行,那你把这个事情如果能够理解的话,那你看啊,回到我们这个代码中。现在我们就这种情况呀,我的这个对象呢,是在我的这个Java端的,但是我真正用的时候呢,其实我是在我这个XQ端的。对吧,好,那如果说你怀疑,诶,我的这个数据量还是比较大的,那你可以把它做成广播变量,如果说这个数据量很小啊,就很小很小的话呢,啊,其实你不做广播站也行,我就给你传,反正你的数据量很小,我一下就传过去了。对吧?啊,其实像我们这个,你说我们现在这个数据量大嘛,我们数据量其实不大啊,他就是维护了几个什么呀,就维护了一几个什么表明而已嘛,对吧,数据量不大啊,说你这个做不做都行啊,那如果你要想做的话,也能做啊,比如说我们来把它做一下好吧,怎么做呢。怎么做呀,同学们,那你叫什么SSC点什么?呃。
19:03
呃,应该这个啊,错了,SSC点什么叫做呃,Spark contact,然后呢叫拿到什么这个。Broadcast。对不对,然后呢,把你的谁呢,把它放进去做成这个广播音量,好接收回来,这个是我们的叫做factor,呃,Tables的一个BC啊,这是这个broadcast啊,广播变量,那同样呢,下面我也可以把它做成广播变量啊,这是SSC点什么呀,叫做Spark context.broadcast。呃,然后呢,把这个dim table4给它割过来,割过来以后呢,我们接收回来对吧,这就是我们的叫做dim table4的一个BC,能理解吧,好,那你做成这个广播变量以后呢,我们接下来用的时候,你就要去有点讲究了哈,你怎么用啊,你就不能直接这么去用了吧。对吧,你得从你的广播变量里面去获取,要不呢,它是不从广播变量获取获取的啊同学们怎么怎么获取呢,这么来获取就是你的广播变量点Y6。
20:09
呃,诶。Fact tables,我我写的啥呀?呃,我写的fact ta啊对吧,Fact tables啊,行,来写一下,就是你的广播变量里面的value,这个value其实拿出来的时间出来的就是你的。这个东西就是你的这个集合对吧,那么同样道理,我们下面也是一样的啊,就是你的这个叫做呃,DM tables,然后呢,BC.value。对吧,就从你的广播变量中去获取。OK吧,诶这样就把代码改完了啊,改完以后来我们上面这个,呃,在这个位置啊,写个注释啊,这是什么做成广变量啊,这个做成广不变量啊,来这也是一样的啊,做成这个光不变量明白了吧?啊所以这个点的话,对其实对于我们现在来讲的话,你做不做都行哈,因为我们数据量确实不大啊,但是呢,我想给大家去说到的就是你要考虑到这个问题,你的driver要给这个SQ去传东西的时候。
21:11
对吧,你明确要传了,那你要考虑点,第一个能不能传序列化,第二个呢,传的数据量大不大,如果大做广播变量。明白了吧,啊,这就完事了啊,OK,行啊,那这就是我们的这个做成的广播变量啊,那当然最后的话,你可以什么做一个整体的测试啊呃,这个我就不测了啊,应该是没什么问题啊,停一下。
我来说两句