00:01
好,接下来我们就来一起来研究一下这个。第三方审查啊,通过red啊,怎么帮助我去过滤数据啊,或者怎么做这个数据的一个驱动操作啊。行,呃,现在我们的这个思想是这样子的啊,我们通过这个red呢,把你这个当日活跃的这个mid呢,给他维护起来。就是只要你有一个mid是活跃的,那我就把它维护到我的中。对吧,那么这样的话呢,我们自我审查以后的数据呢,我们都要什么到你的这个里面去做一个比对去重。啊,比如说这是我的red啊,假如说现在有一个设备ID是m midd101的啊,就是M100101,对吧,它是今天的第一次访问,那么你第一次访问的话,你的中肯定是没有记录过你的,好这个时候呢,我就把M101给它记录进去,那同理啊,你当前的这条数据呢,你觉得什么写入到这个ES中。对吧,好,那假设比如说诶过了一会儿呢,这个M101呢,又访问了一次,这个时候我过来一一看,诶这里面已经有了,有了以后呢,他就什么直接不要了,这个数据,因为我就记录过你了,我就不要了。
01:05
对吧,大概就这么个效果啊,就是我们的今日所有的什么mid呢,我都要在这个red中去做一个记录。能听到吧,做一个记录啊,然后呢,你上面自己做过审查以后的数据,你再到这个red中呢,去做一个比对,如果说有了啊,那我这个数据就不要了,如果说没有呢,那我就把它写到这个red中,并且把数据呢也写到ES中就OK了。对吧,或者这个数据呢,我们暂时先不写ES啊,我们就先把它存下来,就这个数据是是我要的。不就OK了吗?能听到吗?同学们啊,来,这是我们的第三方审查啊,我们所要去做的这个事情啊。好了,那这个你明白以后呢,接下来我们要分析的就是这个这个问题了,现在我们又要往这个red去存东西了。那你只要往这个RA存东西对吧,你只要往存东西,那我们就会涉及到什么呀,你要用什么类型对吧,你的key value,你的API写入读取过不过期,你要用什么东西。
02:08
对不对啊,把这个来分析一下吧,还是放到这啊这个类型,那我们有什么,有字符串,有list,有S,有the site,还有哈西。对吧,大家想想我们用哪个啊。来都跟着我想啊,用哪个呀。还是这个投个票吧,啊投个票吧,大家觉得哪个比较合适啊,打到公屏里面啊。好,有同学投了赛一条啊。Sat都投呀。啊,都是投的赛是吧?行,呃,那赛就胜出了是吧?行,那我想问一下大家为什么不投别的呀。
03:04
嗯,还有投资不差的,嗯。投赛的比较多啊,这个字符上的比较少是吧,字幕上有一个同学啊,其他的呢,就没有人投吗。啊行来吧,那我们简单说一下啊,呃,头赛那头赛着,我们赛先放到最后再说啊先说这个字符串吧。这个字符串,这个目前应该是不太适用哈,因为我们是要什么把这个当日活跃的维护起来,那你当日活跃的mid可能会有N多个。对吧,你会有N多个的。是不是,那你就想我有没有必要把这个N多个m mid单独去记录,比如说我来一个key,然后记录一个mid,我再来一个key,然后再记录一个。对吧,有没有必要这么去做。如果说你这么记录的话呢,将来诶,我又来一条数据,我想去比对一下我的RA中有没有这个,MD,你想想你这你得怎么去查呀。
04:04
你记录了很多个KV,你得知道你的每个K叫什么名字,你需要把每个K的这个值呢调出来,调出来以后对比一下看看一样不一样,调出来对比一下看一样不一样。对吧,这个很明显是不太合适的啊,因为我们是一个一对多的一个场景,那你使用这个字符串呀,呃,就不太好。是吧,说这个字符串就直接排除掉了啊,肯定不不会用它啊呃,字符串不用,然后下面就是个哈希啊,因为他们两个这个都有这么自己非常明显的一个特征啊,字符串的就是一对一,哈信呢,哈信呢既可以是一对一,也可以什么一对多。对吧,那如果是一对一的话呢,他肯定也就不用了啊,就是如果一对多的话呢,哈希我们肯定也是什么不再不再考虑使用它,但人家演的什么去做这个一对一,呃做这个一对多。那他做这个一对多的话,我们就想一下啊,它的一对多的就是,嗯,要有一个key,它的格式是fair value fair value,那现在我们就是一个单独的一个mid,就是一个普通的一个什么字符串数据。
05:02
有没有必要把它做成这个效果呢?这一分析好像也没有必要,对不对啊,说这个哈希呢,我们也不太考虑他啊啊,那剩下的就是非常典型的啊,就是这个一对多的一个集合了。就你的一个key,然后呢,对应什么多个value啊,List site the site都能做。对吧,都能做啊呃,然后这个赛的话,它也有这个自己比较显著的特征,就是它是可以什么做排序的,我们要给他带上一个这个S扣啊,那就想想我们刚才这个场景中,有必要说对你这个m mid做排序吗?同学们。没有必要吧,你就把它维护起来就得了啊,说这个贼在的,我们也就不考虑了。是吧,你就排除法也可以,你把它挨个给他什么排除掉。啊,那最后呢,就剩这个list和set。说吧。啊,大家这个都说是用赛啊。那我想问的就是,为什么我不考虑使用list呢?因为你赛制是一个一对多的,那我类似的,我也是一个一对多的,我们两个不同的点就是我是有序可以重复的,你是无序不能重复的。
06:10
但是对于我们当前这个维护这个mid这个场景来讲的话呢,我不就是把它维护起来吗。对吧,维护起来以后呢,将来呢,我我到里面去做一个对比。那你这里面有序没序,跟我这个对比。是不是好像也没有太大的一个关系啊。对吧,我不就是判断一下是否包含吗?我判断一下是否包含呗。对吧。或者是跟你重复不重复好像也没啥关系,比如说你有两个相同的mid记录到这里面了,那我又来了一个相同的mid,你不管是一个也好,两个也好,我都能够判断出来是否重复啊,是否这个包含。对吧,所以从这个基本的功能角度来讲的话呢,他们两个其实都可以。啊都可以啊,但是相对来讲啊,相对来讲这个set的会稍微更好一点,就从我们目前分析的这个角度来讲啊,Set会更好一点,为什么呢?因为你list和这个site去判断这个是否包含啊,它这个效率肯定是不一样的。
07:07
你累的话,我只能是老老实实的一个一个的去做什么,去做迭代。对不对,那set的话呢,我们常规的set啊,它都是什么通过这个哈希来去做的。那我是可以什么完全什么,直接拿上你要被判断的那个值,求哈希,然后到它里面去看看有没有相同的。对吧,我就说不需要说这个挨个去迭代他,那这个效率呢,会稍微更好一点。对吧。啊,但是呢,呃,我们的数据其实没有多少哈,我们数据比较少,那比较少的话,我觉得这方面的这个优势应该是这个差别不是很大的。啊,差别不是很大啊,但是你要考虑到啊,确实这个set呢,零的情况下会比你这个list呢,要性能会什么更优一点,就从这个什么判断啊,判断这个是否包含。对吧,或者什么从这个移除啊,现在都会什么比较好一点。好吧,那你从这个角度考虑的话,那确实这个赛呢会比较好一些。
08:01
但是呢,我觉得这个呢,并不能什么作为我这个最终选择赛的一个根本原因。啊,其他里面会有一个什么更加关键的因素啊,最后呢,我们确实会选赛啊,但是现在我还没法告诉你为什么最后选了赛,不选这个list。所以说呢,现在啊,我们就先把它放到这儿,就是list和site,我认为我都可以选。啊,我认为我都可以选,然后呢,我们再往后写的过程中,我们会遇到一个比较严重的一个问题,嗯,到时候我们再来去分析,结合这两种类型去做分析,你就明白为什么我们最后要选site,不选这个list,好吧,但目前看你是看不出来的啊,因为他们两个功能都能够满足我。OK吧,所以说呢,来这一次我们就没有得到一个最终的答案,我们得到的是两个备选的。啊,那你要什么,再往后写写,看到底用哪一个。OK吧,来这个我们就往后写啊行,那这个key的话呢,呃,Key其实无所谓啊,你不管用list也好,用sat也好,Key你就来一个,呃,就是维护的什么呀,维护了那个活跃是吧,那我就想就叫什么dau。
09:07
嗯,我想想啊dau。呃。这啥呀?Dau,然后呢,我们是做的是这个。呃,维护的什么,维护了这个mid对吧,取个K吧,取个K吧,K叫啥呀。啊,这是日活的呗。对吧,那我这个开头就就叫这个Du啊,后面的话,后面再来个啥呀,后面再来个嗯,再来个日期,那行吧,因为什么呀,因为你这个驱虫的话,你这个每一天你是为什么单独去做驱虫啊。是不是比如说我维护的是今天啊,因为日活日活不就什么今天的这个日度活跃吗?那我今天过了以后呢,明天我是不是得重新来一个K了呀,你不能说我明天还使用你当前这个K吧。比如说我昨天我这个1001这个访问过,那我明天101又来访问了,如果说你还使用这个的话呢,它里面肯定是记录了1011001的,那你再来了以后呢,发现说已经记录了,那我就什么直接给你干掉了,这个数据我就不要了,那你统计肯定是不对的。
10:09
对吧,所以这个我们是需要什么标识,你这个哪一天的啊,所以后面我就来个什么,来个日期啊,对吧,来个日期我觉得就可以了。好吧,就简单一点啊,这就是我们这个K啊,那这个Y6的话,那就是mid的集合呗。对吧,MD的这个集合啊,行好,那再往下看啊,那如果说我们。用这个list的话呢,我们的这个写入API应该是什么呀。List。啊。那就是L。对吧。或者什么r push,这不都是往里面写的吗?能理解吧?啊,那如果用set的话,那set呢,就是SI的呗。对不对啊啊,把它分开一点啊好,那这个读取呢。
11:02
啊,同学们。读取的话,我们怎么读啊,这个读取的话呢,我们是不是要把它这个都读出来,你看按照我们这个分析啊,就是我需要。把你这个red中啊,所有的这个mid呢,都给它读出来,读出来以后呢,跟我当前所要判断的这个m mid呢,去做一个什么,呃,这个这个包含的一个什么判断。对吧,那我就需要把这个类似所有的什么,所有的这个什么这个。MD都给它读出来,那我一次性读出来的话用哪个呀,同学们。啊,这个好久不用啊,这个确实也记不住啊,看一下啊看一下。嗯,诶,我这个没开啊。这个类似的用的相对比较少啊,他这个好多命令这个记得不不是不是很清楚啊。嗯。大家有同学记得了吗?用的哪个呀?啊,有没有记的同学?
12:02
然后润,嗯。可以啊。我记得它好像没有一个就是特别好用的啊,它只能是按照这个范围去取啊,就是L,然后写个零零杠一对吧,零杠负一啊,零到零逗号负一啊,这么来去取啊。行呃,那我就先先写了吧,我就开半天啊。来是吧。对不对啊,行来再往后啊,呃,那我们这个set set这个读的话应该是用就是s members是吧。能理解吧,S members就可以了啊,就把大家都读出来啊好,然后这个过期不过期呢?那这个必然是可以过期的吧,因为你维护的是日度活跃,那我这个今天啊,我这个都维护进来了,那过了晚上这个凌晨00点以后啊,我就这个东西就可以不要了吧,对吧,说这个过期的话呢,我们就24个小时吧,对不对,24小时过期啊。
13:09
那行吧,就这个数据我们今天过了以后,明天我就不要了,那我就什么可以让他什么过期了,你不用什么一直存着对不对啊行来这是我们这个分析啊好呃,那把这个分析好以后,接下来我们就把这个过程呢给大家去写一写啊,这个怎么写啊,这个你看啊,因为这里面我们会用到呃RA就是我们要什么从你的red去查东西了,对不对,从查东西,那你就要去考虑到我red呢连接的这个开关问题了。明白吧,那你尽可能什么要少开多用,就是我开一次连接,我尽可能什么多去多去用它,你不要说这个用一次开一次,开一次用一次,这样是不太好的。所以说呢,当你意识到有这个问题以后,或者说有这个环节以后,那你再去用这个算子的时候呢,你就要去考虑一下了啊来我们之前是用到了这个filter stream对不对?好,Fair stream,呃,我是要做什么操作啊,同学们这个是不是依旧是去做这个过滤的操作呀?
14:10
对吧,依旧要去做过过滤的操作,就是把它里面一些什么不要的数据给它过滤掉,那如果你过滤的话呢,我们必然是用这个filter。对吧,但这个feature这个不好的点在哪里呢?不好的点就是它是一条数据一条数据做处理的。能明白吧,就这个啊,它是什么一条数据,每条数据执行一次的啊,那就表示写到它里面的代码一定是什么一条数据执行一次。对吧,那我们这个如果说red连接啊,Red这个连接啊,太频繁啊。频繁啊,这个我就什么直接写到这了,太频繁了啊。能理解吧,啊所以说呢,呃,你用这个filter行不行呢?嗯,可以肯定能够实现啊,但是呢,这个我有点接受不了。
15:03
啊,你就相当于什么,相当于你来一条数据,我就什么开一次连接,然后用完以后关掉,来一条数据,我开一次连接,用完以后关掉啊这个我接受不了啊,所以说呢,我们就不考虑使用它,呃,那不考虑使用它的话,大家想想吧,那你会用什么呀。这个时候我们就在想哈,那他有没有说类似于这个。分区的这个处理方式,比如说什么什么爬梯声什么的。对吧,啊,你看像我们这个for吧,有什么有这个for什么part,对吧,Map有什么map partition。是不是?那你这个地方你用什么呀。没有这个partition啊,你不用找了,肯定没有的。咋办?啊。用这个啊。想想行不行?
16:07
呃,为什么用map partition呢?因为我主要看中的是这个partitions,就表示呢,我是可以什么按照这个分区啊为单位进行处理的。对不对啊,那如果说你这个行得通的话呢,那我只需要什么,在每批次每分区我开一次连接就可以了。对吧,每批次每分区我开一个链接就OK了,好,但关键是我们现在想做的是一个过滤操作,你给我来了一个什么map操作,这样能行吗?注意可以,为什么不可以啊?因为你想啊,他这个map partition是什么意思,就是他给你一个集合,假如这里面放了什么,放了什么这个A,放了什么B,放了什么C,那你将来给人家返回的肯定还是一个集合吧。对吧,因为他本意是本意什么,本意是什么,去做什么做map中映社的。对不对,就是我们正常啊,正常我们的使用可能就是最后给它处理成,处理成比如说A什么BB什么CC。
17:00
对吧,这不是给每个数据做了个映射吗。好,那难道我就不能把它处理成a ABB,我CC不要了吗?这不也是给你返回一个集合吗?对吧,你这个数据我不想要了,我不满足我的条件,我不处理了,我不想要了,那最后的结果呢,就不包含你不就OK了吗。是吧?所以大家注意啊,这个filter我们是可以给他做优化的,给他优化成这个map partition。理解了吧,啊,这个东西呃,如果你对他很熟的话,那你应该能够想得到哈。行吧,来不多说啊,那我们就接着往后去做。这个里面给我们传过来的是一个page log的一个就是迭代器啊好接着往后写,呃,然后呢,我们拿上这个page log的这个EL,然后做一个什么for循环。对吧,这是我的配置到了啊。OK。
18:00
然后呢,呃,最后我们要给人家返回一个,这个宇宙长这样吧,我先给他返回一个。先返回返回个空吧啊,要不这个一直在报错啊。行,那么大家看看啊,呃,我们这样的话,你看看我是不是可以在你这个for循环的外面,然后呢,去开关你的这个red这个连接了吧。对吧,诶放到这以后,然后最后用完以后呢,我这个统一关一次,这样是挺好的啊行好吧,那我们就是拿到了这个一个批次的数据,拿到一个批次的数据以后呢,接下来我们要做的事情呢,就是跟你的red呢去做一个比对,对吧,那你拿到每一个配置log,那我们是按照什么,按照你的这个叫做m mid来去做去重的,所以说呢,我们要从你的配置log中呢,把这个m mid给它上面提取出来。能理解吧,来提取什么提取mid啊,提取每条数据中的,呃,每条数据中的这个m mid啊,好解释一下啊,就是我们驱虫使用的是就是我们这个日活的统计啊,基于mid啊,这是有的啊,也可以啊,也可以什么基于这个UID啊。
19:06
对吧,就看你这个怎么去考虑呗,好吧,来提取出来啊,怎么提取呢?那不就配置log这样,Mid这不提出来了吗。对吧,那这就有了呀。好,那你这个MIT有了以后,接下来干嘛呀。是不是从你的red里面去看了呀,看看你的有没有这个东西。对吧,看看有没有这个东西啊,来吧,那我们就写吧,那你既然要找red了,那我就把red链接打开啊MY。好get一个什么judge from接收回来judge行,那我在这个for循环后面,我提前啊给它干掉关掉。对吧,行,那你看一下啊,现在我们虽然说做的是这个过滤啊,虽然说我做的是一个过滤,但实际上呢,我用的是这个map partition,就说白了,你要自己决定哪些数据要,对吧,哪些数据不要,你要把那个要的呀,自己给他先维护起来。
20:12
你能明白吧,你先自己把它维护起来,如果说你不把它维护起来。那数据最后就没有了,因为我们毕竟不是用的这个filter filter的话,人家会什么会按照你给他返回的一个结果,比如说你是true还是false,然后呢,决定把这个true给他什么,自己他会怎么给你保留下来,但我们用的是一个map partition,那我们就什么需要自己去把想要的数据给他留下来。能理解吧,所以说呢,我们想要留的话,那我就这样啊,就是呃,我提前啊在这个位置吧,我去创建一个就最后的结果啊,那我就用这个list buffer了啊好,这里面放什么呢?就放我这个配置lo。对吧,主要配置log吧。那行吧,这个是什么?这就是我们的存储啊存储啊这个这个要的数据啊,明白了吧,好,那你这个都有了以后,接下来你看一下啊,这个干嘛呀。
21:04
你拿到它以后,接下来就是对来的什么,这个就是包含判断,包含操作啊,判断是否什么包含操作,OK来这个时候呢,我们就可以去分别去对待了啊,比如说我们如果用的是list对吧,或者我用的是site,我们应该怎么写,看完了同学们。这个就比较关键了。啊,这个就比较关键了,这个代码你要怎么去写,嗯,这样吧,我们分开来说啊,先写到这啊。
我来说两句