00:00
那么接下来一个就是多维去虫分析的时候啊,使用F语法能够有效的减少咱们维护的状态量啊。那这个需求也很常见呐,咱们某些场景下面是不是经常统计指标要从不同维度来统计啊,对吧?比如说还是要做一个count distinct的,那比如说我们统计UV的时候,除了全局UV,咱们经常是不是还统计什么,APP端的UV是多少,Word端的UV是多少,总的UV是多少,就是说咱们会从不同的维度,不同角度去做一个统计,那比如说就上面这种例子,不同维度咱们会怎么做?Group by a,比如说按天对吧,Group by天啊,然后呢。改成A吧,对应起来好,然后对某,比如说B是一个设备ID,对设备ID进行一个去重,然后进行一个count,那这个得到了是不是一个总体的UV啊。那在接下来咱们想要分析某一端的一个UV会怎么写呢?会怎么写called distinct的case when。当我。
01:07
渠道,比如说你是APP端web端对吧?啊,这个字段表示就是APP还是we啊这个字段,如果这个渠道在于咱们指定的,比如说这个是一个APP,那么我们就取mid保留,否则为闹填充对吧?Case问做一个呃分支处理,那这个呢,就是咱们比如说这个统计的就是APP端的UV。啊,这边是列举两个值,如果你是单维度,那是不是一个值就行啊。另外一个,你看count this thinknk的case when,当这个渠道字段处于比如说是属于word的一个值这里,那么就保留mid,否则为now,然后呢,对它进行count distinct的,这样统计出来就是另外一个维度的UV。咱们经常这么写对吧,但是这样你想想,对于他来讲是不是得维护一个状态。
02:02
那对于这个语句来讲,是不是也得维护一个状态,那么对于他来讲是不是也得维护一个状态,对吧?那其实这个状态是不是可以复用的。啊,默认是没有,默认是没有,那如果咱们把它改写成Fi语法,它能够识别什么同一唯一键上不同的Fi参数,什么叫同一为一键呢?就是distinct这个字段,如果是一样的,那么其实咱们是可以改写成the语法的。就去重的字段是一样的话,那你看比如上面distinct都作用在B这一列上面,标红这一列,那经过优化器识别后,他们可以什么只使用一个共享的状态实例重点是什么?用一个共享。而不是像之前咱们说的三个对吧,这样就可以很有效的减少咱们对状态的大小,还有一个对状态的访问,那改写语法怎么写呢?来咱们截个图对比一下。
03:05
第一个没得讲,这个肯定还一样,第二一个case问我不要,Case问的还是这个count distinct b,然后呢,后面改成the,后面写一个过滤条件where对吧?这个字段在这个里边。这个的值就行了,这样就可以了,改写成theatre。那下面也一样,Case when改写成the,后面加一个条件啊,就是这个问条件,把它改成什么where就行了,好。这样就可以达达到共享一个实力的,共享一个状态的效果,来,我们来感受一下,首先是啥也没开。这个是啥也没开,呃,看一下代码吧,Dim这个案例。Dim discount。这个就是咱们刚才语法一样,Group by mid对吧,然后count distinct的AR这个字段,这个也是AR,这个也是AR,对吧,这是word端,就是豌豆荚端,渠道不一样,咱们分渠道统计这个AR的去通值有多少。
04:13
那下面这个就是改写成the的了,你看这边都改写成the where where对吧。好。去重裂是一样的,好,那我们分别来演示一下效果吧。首先是多维distinct。这个case问传统写法啊?啊,点开,那既然是状态,咱们就关注状态就行了,咱们打开切个poem,在这刷一下历史或者看它的总结就行啊,咱们稍等一会。咱们主要是关心就是什么状态的大小有没有改变吗?如果咱们现在写了三个count distinct的,那应该就要维护三个状态,那如果改写成fit就只需要一个,那就是从。
05:09
切,Point的大小能够很明显的看到。看他。啊,这统计值也不好,咱们看它的一个变化吧,咱们看它前十次好吧。前十次这个泡影。然后截个图,咱们做一个对比就行,好十次。取消。接下来我们试一试,我用the语法又会有一个什么效果呢?咱们改成另一个改写the语法的。
06:07
胆大执行。同样的点进来看一个checkpoint啊,看一下每一次的大小有没有变小。啊,稍等一会儿。咱们同样对比前十次的这个point就行了。因为咱们这个代码用的应该是默认的那个。不是增量的对吧。
07:04
其实对比前几次大家应该有感觉啊,一会儿把它放一块儿啊。啊,九次了,其实已经效果出来了。好,我们对比一下。首先这个时间啊,没有怎么减少对吧,因为你每次做checkpoint还是需要那么长的时间,差不多没有什么提升,另外我们看这个大小。你看横向对比,横向对比。是不比原来小了?对吧,越到后面越明显,你看最后一次第同样是第十次checkpoint,那么这边呢,已经达到20兆,这边才12兆,对吧,这就是使用F语法可以减少咱们对状态的维护啊,状态大小还有一个呃,提升它的效率。好吧,这个就是咱们可以提到的一个比较好的优化,那下面呢,最后我把咱们正常开发里面,呃,可以开启的一些参数啊,尽量还是一起开启对吧,首先第一个mini batch啊,能开就开对吧,对延迟没那么高要求,先开,接下来local global也开。
08:13
呃,自动。呃,两阶段打散也开对吧,然后这个打散的数目,那后面这个时区高版本的就不用指定,低版本时区有个问题,默认他用的是UTC,也就是说用的是那个伦敦时间,跟咱们北京时间差八个小时,如果你是低版本还是指定一下,如果不是的话,高版本的话,现在一般用的都是当地的本地时区啊,没什么大问题。
我来说两句