00:01
好,那我们还是一样的,把昨天所讲的内容呢,做一个。快速的回顾,昨天呢,我们写了两个需求对吧,一个是交易支付各窗口的汇总表啊,那另外一个呢,是。下单。川国的汇总表,那这两个呢,其实。从需求来说差不多对吧?啊,那主要呢,在于订单里边呢,我们加了一些金额。啊,在订单当中呢,我们加了一些这个金额而已,对吧,而对于我们的。这个支付数据呢,没有考虑这个金额,只有这个人数对吧?呃,当然我们说的第一个点,如果人数的话,这个方式非常好求了。是吧,我们已经写过太多太多次了,那就弄一个状态存这个日期。然后呢,判断状态是否为钠。对吧,或者说统一判断吧,呃,状态。
01:02
等于,那那么我们的独立用户数,就每日的独立用户数以及新增的付费用户数都。加一。对吧?呃,那如果说呢,你不等于呢,那我就跟当前的日期进行比较。如果说你跟当年日期不同,那么我们每天的独立。付费用户数加一。好,那总的不加,因为你状态不等于空,说明之前你呢负过。对吧,花过钱了,那对于首次支付成功用户数呢,就不加了,这个倒还好。关键的问题在于什么呢?我们又引入了一个点。我们说支付数据啊,它是从我们topic DB里边过滤出来这个支付成功的数据。与下单数据怎么进行一个join操作?
02:00
对吧,而下单数据呢。在前面是预处理订单,预处理表里边过滤出来insert数据。对吧,啊,过滤出这个音色的数据的OK。那在我们预处理订单表的时候呢?我们用了left join。也就是说未来呢?对于。一个下单数据而言,特别是对于这个明细啊,你下单数据呢,跟明细关联,本来就会产生这个多条,对吧,关键明细正常来说呢,它只有一条,但由于咱们用了level drawing。诶,它有可能会出现多条,因为我们当时用的是撤回流,也是阿的卡夫卡写出去的,对吧?呃,左边线来数据写一个左捺出去。然后右边来数据了,那么。撤回刚才的数据对吧,但是对于阿布的卡夫卡呢,它并不是真正的撤回,而是写出一个浪的数据。接下来写出一个左右。
03:00
数据出去对吧,那按照正常来说呢,我们肯定会保留这个数据最全的这一条吧,因为很明显这个重复数据,如果说你两个都要的话,特别你在计算一些什么度量指标。啊,计算count啊,或者说sum类似这样的,你就你不做驱动,直接拿过来做计算的那种,那完了。对吧,啊,那你的数据呢,就重复了,所以呢,很明显我们这里边儿可能会要考虑到这个去除。对吧?啊,当然我们最后提了说,在我们统计这个独立用户数和这个首次支付成功用户数的时候呢,我们在求用户数的时候,他是不需要做这个。驱虫的。啊,他是不需要做这个驱虫的。对吧,啊,这个大家要注意一下。啊,因为我们呢,在最后那个10.9那个需求本身比较复杂,它呢肯定铁要去重,所以呢,我们把这个去重两个不同的逻辑呢,我们给他提前了啊,虽然他可以不去重,但是我们多做一次去重,他也不会说呃给业务带来什么其他的问题。
04:07
对吧,啊好,那在这个支付里边呢,我们就做了这个去虫这些事儿啊,那么当然想的呢,就是说我们应该如何去做这个去虫的问题。对吧,我们应该如何去做这个驱虫的问题啊好,嗯,那我们想着呢,我们要的是最后一条,对吧,我们刚开始想的要最后一条,正常来说呢,你。左来了左捺右来了左右对吧,那我肯定要左右都全的这一条后产生的这一条,那我们就想到一个办法,呃,我要去比较这个时间。啊,我要去比较这个时间对吧,嗯,那么。我们有两种方法来取到这个最大的力条,那第一个呢,就是。用状态编程。数据来了,诶状态为档对吧,我把这个数据呢,放到这个状态里边去。
05:03
接下来呢,注册一个定时器。啊,你后续数据来了,我会判断,如果你状态不等于钠。那么我就比较状态当中数据以及当前数据,它的一个时间的大小啊,这个呢,当然是呃,被处理的时间。对吧,被处理的时间有大小,我们保留这个时间比较大。啊,我们要保留这个时间大的这条数据。对吧,呃,那之后呢,到定时器出发了。一旦定时器触发了,我们就输出状态里边的数据啊,这个时候你也不用判断状态是否为档。不用判断,因为我们的代码是怎么写的。啊,我们代码很简单,我们代码呢,直接是。状态如果等于,那我把数据放在状态里边,并且注册定时器,也就是说我去更改状态数据加注册定时器,这个呢放在一起去操作的。
06:02
对吧,所以呢,只要定时器能够去触发。那么状态它一定不等于呢,所以你就不用判断了,你直接输出就好了。对吧,你不用担心,哎,输出了一个浪值啊,不用操心这个事儿啊,同时呢,嗯,输出完之后呢,你把状态呢清一下啊,因为这个状态就没有用了,就没有用对吧?好,这是我们提到第一种方案,用专态编程的方式来做,那第二套方案呢。是。我们开窗对吧,我们可以开一个窗口一样的,因为你定时器呢,嗯,也是。有这个事情。对吧,啊,你定时器也会有延迟啊,就是说你这个数据结果要等到定时器触发了,它才会真正的被输出。那我开窗也一样啊,你盯湿气盯多久,我窗口呢?开多大?对吧,我可以搞一点延迟。啊,搞一点这个延迟。
07:00
对吧,呃,那这种方式呢,还是一样的,在窗口里边呢,去比较这个时间,当然你可以用增量,也可以用全量,对吧,全量就是便利啊,但实际上呢,开窗它没有这个。没有什么呢,没有我们所说的状态编程用电视器这种方式好。啊,那为什么呢,给大家说一下啊,因为我们用定时器,呃,比如说啊,我数据呢是九秒。他九秒来的,我电线呢加五秒,他呢正常的14秒输出对吧。好,那假如说呢,你13秒来了一个数据,九秒到13秒来了一个数据,对吧?哎,中间呢,间隔四秒可能可能啊太正常了。对吧,中间呢,间隔了这个四秒钟。啊,因为你给他五秒嘛,对吧,你网络延迟是五秒,那它两个数据之间间隔是四秒钟很正常,那我们如果这种情况是不能正常输出这个。13这条数据没毛病吧,对吧,因为你定时器还没响,我数据来了,我会把这个替换掉,定时器响了肯定输出13,但是开窗呢。
08:08
不好了,如果你开了个五秒窗口,那么九这条数据呢?它属于什么?五到十这个窗口,就算你设定了两秒延迟,那么它在12。窗口就关了,那你接下来来13完了。能明白什么意思吗?对吧,你来13,你把13又输出了一次,因为13呢,它属于什么。这个。食道。15这个窗口他俩呢,压根就不属于同一个窗口,看见没,九跟13,其实他俩呢,差距就是四秒,但是呢,由于不同的窗口,所以呢,你这个数据会被输出多次。能明白吗?这个点对吧,所以为什么我们说了三种方案啊,我给大家写的就是一二啊,你要是写的是一三啊,第二种方案呢,就没有用啊,如果你要用的话啊,呃,那你这个窗口时间得开大一点。
09:08
对吧,如果说你是前面是五秒延迟,可能你需要开一个。十秒,或者说开一个这个。15秒,15秒窗口,但是你就算开多大啊,这个都不保险,为什么,因为他刚好就跨在两个窗口呢。他俩本身延迟不高,对吧,就跨了两个窗口,你怎么办呢?它不在一个窗口里边,你是不是就比不了啊,能理解吗?对吧,所以其实这个第二套方案里边呢,嗯,不太好。啊,这是第二的方案,就是我们所说第二这个里边,当然这个里边是第一个啊,这个里边是第一个。对吧,啊,那我们所聊的,我们当然给大家说的是这个第二个。在这对吧,方案二啊这种方式。啊,听起来还不错,但是实际上你仔细想它是有一些问题的啊,这个点呢,我们需要跟大家说一下啊,所以呢,我们当时就没有用这个方案二啊,那一跟三都是可以的,对吧,但是三呢,它有一个前提条件。
10:10
啊三呢,它有一个前提条件对吧,那什么前提条件呢?就是说三呢,我们是怎么做的呢?我们是保留第一条啊,当然这个第一条不是说,呃,真正join数据出来的第一条,我就看谁先进到我DWS层对吧?啊,那我就取这个第一条,也就是说其实也不是第一条,我任取一条。都可以。对吧?啊第三个呢,它有个前提条件,我任取一条都可以啊,那是因为我们呢,不需要用到右表的数据,诶当前这个需求呢。他没有用到右表的数据。对吧,那有人可能在想,那没有用到右表数据,我干嘛前面要关联那个右表呢?你不能这样想,因为我关联预处理表,你用不到不代你这个需求用不到,不代表其他的需求用不到,能理解这个意思吧。
11:01
对吧,有可能会其他的需求会用到,所以呢,该关联还是要关联,只不过说这个需求呢,我们用到的就是订单与订单明细表,像那个订单明细购物券以及订单明细活动用不到而已。对吧,啊,那这种情况呢,我们就可以任取一条,那既然任取一条的话,那我们就按照这个。处理时间。对吧,我取第一条呗,谁先到我就取谁不就完了吗?这个效率还高,比你第一个方案是不是效率还高啊,第一个方案呢。你怎么样,你得。等到。最后对吧,数据都来齐了啊,大概来齐了,就是说你得把握好这个时间。啊,得把握好这个时间对吧,得来齐了你才能去做这个渠道最大一条,那也没办法,因为呃,方案一呢,主要因为是我们确确实实要的最全的这种数据,那没办法对吧,你最全的数据呢,由于你用的level draw,那有可能数据就是不同时来呀,你就得有这个延迟,对吧,你就得忍受,就跟我们前面聊的那个。
12:10
呃,将这个日活对吧,嗯,UVG,还有这个PV,这些需求放在一起。需求,那又借这个。结果呢,他本身就是有这个。延迟,那你其他的需求你就得跟着接受这个延迟,那没办法。对吧,你必须得忍受这个延迟,是这样的一个情况对吧?好,这是我们所聊的去虫的方案,那后面呢,就正常的去写就好了,对吧,啊呃。那驱动方案搞定了之后呢,就。没什么太多可说的了啊,那下单需求呢,我们在这个基础上还加了一个订单的金额,那也就是说他是必须要去做这个驱虫的啊,但是呢,呃,由于我们分析发现啊,它确实没有用到。后续的一个数据对吧,右表的数据,那么呢,我们就完全可以采用这个。
13:03
第三套方案去做去重对吧?所以呢,一三两种呢,都给大家介绍了啊,但文档当中呢,都是用的第一种啊,所以呢,我在讲课的时候呢,两种都给大家写了,大家呢,呃,未来工作的时候都可以用,但是呢,第三种用的时候呢,你得知道你当前这个数据呃,有没有用到右边,如果是用到右边只能用第一种方案了,对吧?第二种呢,就不建议大家用,因为它里边可能会出现这种问题,好那。这是我们昨天所说的一个事情,对吧,相关东西呢,都给大家分析到位了啊,面试的时候呢,你可以详细的给大家去阐述的去说对吧?啊好,这是昨天的内容啊。
我来说两句