00:00
呃,那么接下来呢,咱们看一下整个的流程对吧?啊,就是咱们刚才分析过的啊,里边所做的一些事情,只不过说呢,我们再把这个再串一遍而已啊啊整体的来看一下啊,因为之前我们是需求分析,还有具体的去虫,这个逻辑呢,我们分开去聊的对吧?那这块呢,我们整体来看一下啊。首先还是消费我们DW层支付成功主题的这个数据,对吧,还是消费这个,消费这个以后呢,我们肯定要把它转成这个。对象。对吧,啊,同时考虑到啊,但是这一步其实还好,因为前面我们已经。把那个馕值给干掉了。对吧,因为支付成功呢,它是消费的什么。支付成功这个数据它是怎么来的?读取topic里边过滤出这个支付成功数据啊,去join上咱们的下单数据。
01:03
对吧,所以前置呢,就已经把那种nu的数据给它处理掉了,递答地走,如果说你考虑这个问题,呃,你在写杰森的时候,过滤非杰森格式数据,把它加上做一个双保险也可以,对吧?那等会呢,我们就加上呗,对这个也无所谓,对吧?好,那再往下一步呢,就是我们要按照这个detail ID分组,因为我们要考虑这个去重了,对吧?那我们用的呢,就是方案一用那个状态这种方式来做这个。去虫啊,来做这个驱虫好吧,啊,那接下来呢,这里边儿就是用。对奥ID相同数据去重啊,那这个驱重的方案呢,就是刚才我们说的。对吧,已经说过了,这大段文字呢,就是刚才文档当中粘过来的啊好呃去好重,以后我们要设置这个水位线。好。设置位线按照用户ID呢分组。啊,那这个时候为什么按照用户ID分组呢?那是因为咱们要提取这个用户数,按照用户ID还要再做一次去重。
02:06
对吧,所以之前我们提到了,因为这里边呢,未来还是要按照这个用户ID做一次去重,所以呢,前面这个去重啊,你可以不要,这是我们之前说的事儿,但是呢,我们这儿还是做一下,对吧,你就多写几次,因为这个代码啊呃,因为level join呢,这第一次用嘛,对吧?所以关于他的去拢呢,我们呃,多写一写这个总没有坏处对吧?好,所以在这块呢,按照用户ID分组之后呢,呃去重,那这个去重呢,判断我们保留一个状态保留。最后一次下啊,就支付成功的这个日期对吧,好先判断它是否等于闹。啊,那如果确实等于呢。那么我们当日的用户数即为一。新增的付费用户数呢,也是为一两个呢,都是一。对吧,好,那如果另外一个逻辑,它不等于呢。
03:01
不等于呢,我们还要继续判断对吧,判断什么呢?跟当前数据日期是否相等。啊,如果不等,注意这有一个感叹号不等对吧,诶是不等不等怎么办呢?那我当天的人数加一,但是总的新的用户A是零对吧?啊那如果相等的相等两个都是零啊,但是这个逻辑你不用写对吧,因为你初始的时候你会定义两个。啊,会定义两个这个。四段啊,默认值呢,给的都是零对吧?啊,但是最后呢,我们得判断诶,至少这个。当天的用户呢?不等于零,我们才需要输出对吧?啊,统计这个人数就是由这个结果,诶把它汇总过来对吧,三个点汇总过来,但这个呢,你可以不用写啊,啊之后呢,把这个数据做这个。输出啊,把这个数据做输出,当然这里边儿如果说你这个数据改了对吧?啊是一,那你这个状态要更新啊,状态更新那肯定要做这事,你要状态不更新永远都闹,那就没什么聊的,那每一条数据都是一。
04:05
对吧,每条数据都是一肯定要状态要更新啊,更新的当天最后呢,我们再开窗聚合,因为求人数嘛,没有分组了,对吧,直接开窗聚合,还是这个全量窗口啊,然后呢。把它正常的写出去就好了,写到克house,当然开张聚合的主要是为了补这个开窗的。开始跟结束时间,然后TS呢做一个替换对吧,好,那什么时候变成这个招聘字段的呢?就在这一步。对吧,在这一步把我们阶层数据变成这个招聘阶段,最后呢,开窗聚合直接就不用管了,对吧?好,这是我们整个的一个思路对吧,其实就是我们之前所提到的这个点啊呃,最后写出这块呢,还是我们用写好的这个工具类啊,写好的工具类对吧。这是我们整个思路的一个整理啊,接下来呢,我们就可以做这个coding了,对吧?啊,可以去这个coding啊。
05:00
好。接下来写代码啊,第一个界表语句,呃,我这边集胸环境没开啊,没开的话我就这个等会再做,等会测试的时候,我们之前把这个做一下啊好,那第二招聘招聘呢,拿一下这个我们现在已经非常熟悉了,对吧,窗口的开始跟结束时间,然后呢,两个指标,最后一个TS啊好。把这个呢,拿到这个并幕落下啊,咱们这个类越来越多越来越多了,对吧,啊还挺吓人的啊,咱们终于不知不觉诶写了这么多的。代码了啊,大家可能在最开始的时候都没有想过对吧?啊,不敢想诶,我居然一个项目当中还能写这么多代码,一点一点的跟下来,其实也还好,对吧。坚持对吧,坚持才是胜利啊好,那这个东西呢,就放在这儿了啊呃,接下来呢,到我们核心的这个DWS层这边啊,这个来写一个我们的类啊。把这个类定义好。啊,把它类定义好,定义好以后呢,我们有个事情要提前处理一下什么事呢?因为刚才我们提到了,我们这边呢,要用到这个状态编程去。
06:11
做我们的驱虫对吧,那考虑到乱序数据问题,我们不能说注册一个电视器以后,就是说你后来的数据我写到这个状态里边,不能这样,我们是不是说了要比较什么。比较这个时间对吧,好,关键的问题在于,我们比较的这个时间哪来呢?对吧,那我们就找到这个支付成功的这个。这个支付成功的明细,对吧,这里边时关于时间字段我们看一下啊,呃,有哪些呢?嗯,这都没有有这个。这个没用,这个是支付成功表里面的所有支付数据都一样,对吧?呃,然后呢,还有什么时间还没有了,这里面时间呢,好像只有他自己,那完了我们也不能按照他比较啊,因为。
07:01
这个时间呢,是所有的里边都。一样。你要注意啊,所有的。数据都一样,你按他比较,你肯定比较不出来啊。对吧,那怎么办呢。那怎么办呢?啊,那注意啊,这个数据呢,我们有一个办法在哪呢,你不是关联这个订单。这个数据吗。对吧,啊,订单明细数据,而订单明细数据呢,取自我们的订单预处理表里边过滤的这个音色的。对吧,所以呢,我们可以干什么事儿呢,不是为了区分在转语过程当中,他每条数据呢,我们希望都给他一个特殊的。四段。对吧,都给他一个特殊的字段啊好,那咱们可以这样做啊,这里边呢,有给大家写到在这边啊。就关于这个时间问题,在弗林当中呢,它有这么几个啊,叫local time step current step,以及current time step啊返回本地时期的当前时间戳,对吧,其实在这里边呢,三个都可以,因为你的统一的嘛,对吧?啊三个呢,你任选一个都行啊,任选一个都行对吧,都是这个毫秒数啊,都是毫秒数,那我们就用它,那也就是说我们要加一个字段。
08:23
啊,加一个字段,加什么字段呢?来在我们这个地方开始加啊在预处理表这。在这儿。啊,回过头来我们加一个字段啊呃,这个字段呢,你也不用说在后面哪儿哪儿去加,对吧,我们直接在关联的时候去加就行了,关联五张表,因为我们可以加字段嘛,对吧,在这个位置啊,我们双引号。上一号。这对吧,呃,这边呢,我们加一个字段啊,这个字段呢,就叫这个。Car row啊,这个字段呢,我们取一个名字啊,嗯,取谁呢就取它。
09:02
就去他。叫operators。对吧,好操作,那在这加了一个字段呢,注意。这边。加一个。逗号。注意预处理表啊,这你再加一个逗号,因为我把这个字段放最后了嘛,对吧,这边呢,有一个这个字段啊,在这儿就有空格啊,要注意啊好,那这个字段有了,那你不能光在这儿讲,这不行,对吧,还得到哪啊,到我们最终这个表里边,在这儿把这个字段给补充上。对吧,在这我们再加一个字段啊。这个字段呢,就叫。诶,没粘上刚才啊在这。因为这是你用的系统函数去添加的,对吧?啊,那我们给他一个类型,这个类型呢,在这有啊,它是time step step啊。好,它是这个类型对吧,类型要给啊,类型要给这边呢,加一个逗号啊,加逗号对吧,我们又添加了一个字段啊,那预处理表里边呢,我们添加这个字段,那么接下来呢,到这个订单明细里边,我们把这个字段补上,诶那这都有对吧,我们之前就提到过,说未来呢,这个字段我还得真得给他加回来,我就叫肉。
10:15
Operators吧,对吧,好,这加了。这个逗号得补上啊,这个逗号得补上OK吧?啊,前置位你要把这个逗号补上啊,这个呢是过滤出下单数据对吧,从这个订单明细表当中去过滤啊,去过滤出来。当然这个数据呢。咱们在这儿。也给它加一下好,你这不加也不行啊,对吧。建表语句这对吧,啊,这是最早的读这个数据嘛,对吧?啊,这个一定要注意一下啊,注意一下,嗯,不能漏了咱们的这个类型呢,拿过来啊。Detail,你就是顺着上面往下加就好了,这样呢加逗号。
11:01
对吧,诶。好,那加了一个字段对吧,所以过滤的时候呢,咱们就有这个字段去选择了啊把它呢读到对吧,这边加了一个多号,这边呢就加空格就好了啊啊那最后呢,我们要创建这个表,这个表呢,诶到这来对吧,把它打开,打开之后呢,这得加一个。逗号。对吧,在我们的all the detail当中,这个地方呢,再加一个。逗号啊,这块我们都注意改啊,就没有问题,等会测试发现有问题的话,我们还得可能就是这个字段,因为前面我们都已经。测过了对吧,就是这个新加磁带,我们主要观察这个东西,看哪块有没有漏就行了,那么接下来呢,我们就是观察这个支付。支付表对吧,支付成功在这啊意大利对吧,把它拿的括号啊,那首先呢,这张表这个数据呢,肯定要打开,最重要打开这个逗号呢,就补上对吧,以前我们把这个数据删掉了哈,好呃,那再往上走往上走这是下单。
12:01
主题对吧,把这个补充上啊,那最后三表关联的时候,咱们是不是这个字段也要找回来。没毛病吧,把这个字段三表关联的时候呢,把这个字段得找回来,最后呢,创建支付表的时候呢,这个字段也得给我找回来啊,这上面呢,这就没有什么逗号了,因为它有主键,它下面本来就有字段,对吧?所以这个逗号呢,你就不用管了啊好,这边我们检查一下三表关联加了这个字段,诶这个逗号呢,就补上了对吧?这是我们最早的时候删除的这个数据,那到这个为止呢,我们就没有问题了,对吧?往上翻,诶这块呢,也有这个数据了。啊,都有了这个逗号呢,也都补了对吧?好,这是我们前置要做的一个事情啊,前置要做的事情就是说呢,我们要补这个。四段。啊,我们要补这个字段,OK吧,这是一个点,还有一个东西在于什么呢。我们这边做了一个例子啊,就是current time step,就刚才我们用的这个函数,它的返回值长什么样子的,长这样子来看啊。
13:00
就这个。嗯,最后一个吧,拿它就行了,其实他们三个都一样,对吧,这个current step now加car road step,哎,你看数据。对吧,这是它的一个数据啊好,那我们拿最后一个拿它啊,当然他们都一样,对吧,直接把它拿过来啊,啊那我们要对这个数据呢做一个比较。啊,就比较大小,你直接拿这玩意比较大小。不太靠谱吧?对吧,啊,他不太靠谱啊呃,那不太靠谱在哪呢?那也就是说你直接比较大按位比较呗,你要注意你这个是529,你是三位,那有没有可能我呢只有一个什么。95呢。我只有一个95呢。有没有可能?能理解吗?对吧,他后面呢,只有两位跟三位,如果你按位比较,那正常应该谁的是第一个的还是第二个的这个数据。
14:02
它是95毫秒,它是529毫秒,前面都一样,哪个大,第一个大还是第二个大?就是正常的,应该是第一个的。对吧,因为它是到529毫秒,你是95毫秒,但是如果你按位比较,是不是第二个大呀,这个就不能按位比较吧,对吧,那大家想想这个东西我们应该可以怎么比啊。很简单啊,首先呢,按点分割对吧,把前面这个拿到,哎,我把它拆成两部分,拆成它和什么呢。529以及他呢,我也拆两部分对吧。注意看啊。呃,我拆两部分,它呢,转化为TS。毫秒。对吧,把前面转化为TS,哎,这边呢,一样把它转化为毫秒啊,当然了,它转化为毫秒的时候怎么样,这是。
15:00
后三位是零对不对,因为这个到秒嘛,你转化为毫秒,它是不是后三位是零,然后呢,再把这个数据加上。对吧,我直接把这个数字加上怎么样。能明白吗?对吧,啊,关键还有一种,假如说他数据这个样子的。如果说数据是这样的倒还好,对吧,你可以按位比较啊,因为这是零,这是五,你肯定就按位比较也能比较的出来,对吧,那我们刚才所说的,我把它转化为这个。前面对吧,我转化为这个毫秒TS啊,转化为毫秒TS这个东西呢。这个东西对吧,呃,我。乘以一个1000。啊,差个1000。对吧,啊或者说呢,很简单,不管怎么样,对于这个数据而言。我在前面。拼接。很多个零对吧,然后呢,乘以个。
16:01
1000转化这个数字乘以个1000。对吧,诶把这两个数字呢,做一个什么相加,诶把前面转化为TS,然后加这个529,诶那这边也一样,对吧,加这个。95啊,这个呢,加也是加95啊,假如说你的格式可能这子对吧,那我们在考虑这个问题啊,对吧?啊,那加这个95。加这95对吧,这个思路上大家能理解吗。就是我们整个的把它变成一个毫秒数嘛,对吧,因为前半段呢,你变成毫秒数的时候,你最后三位一定是三个零。对吧,然后呢,把毫秒数给他看什么加上。思路上能理解吗?这个思路上能不能理解啊。应该还好吧,对吧?啊这个大家我相信大家能够去理解啊,我就把这个东西给大家去说一下,就是说呢,把它统一转化为毫秒,因为你直接比呢,它有风险对吧。
17:11
095怎么转化的啊,不用担心啊。这个东西不会是吧,来来看一下啊,来到这边。好,那我们直接呢,把这个工具类给大家去。拿一下啊,在代码这,我们有一个这个时间的一个工具类,它呢拿过来啊。其实我们要引入这个工具类啊,在这边。然后呢,把它拿过来,然后我们带着大家读一下这个过程啊,我们之前写的啊,这个就不一个一个带着写了,像这样东西呢,其实都还好,对吧。呃,那首先我们看一下我们是怎么转的,首先第一个啊。来看啊,当然它这个东西我忘了说了一个点了啊这边。
18:01
它真正打印出来啊,嗯,这边还有个东西漏了,他打印出来了,少了一个东西,应该还有个C。还有个Z。啊,还有一个Z啊,它真的打印出来,我不知道大家还记不记得这个,我怎么漏了这个东西,还有个Z啊,那首先呢,这个东西。这个东西咱们是不要的。对吧,这后面还有个Z,就正常的数据呢,应该长这样。正常的数据呢,长这样。好,040Z04Z对吧,长这样子好好呃,那么。接下来我们来看啊。这个地方看我们怎么写的,首先呢,把这个Z去掉,因为它数据格式呢,长这样子,这数据的格式对吧,长这样子,然后呢,我们把这个Z去掉,这个很简单,这个只有一位,所以呢,我们取零到长度减一的位置,对吧,就相当于是两个Z去掉了,没有毛病吧,一步一步看啊好,那第二步。
19:00
这个这样吧,我把它放在这,这样更好看一点,对吧,上面是我们的数据格式啊呃,提取小于一秒的部分。啊,咱们提取。小于一秒的部分啊,那我们看一下它的数据呢,长这样,302有可能呢,是这样子的。这边格式比较多啊,比如说040对吧。呃,041吧,啊,比如说041啊。还有这个。四一。啊,假如说410,他这个最后一个零呢,不写。对吧,啊,类似于这样的,或者说410啊,类似于这种情况都会有啊,都会有,包括这种啊,这种我们都考虑进去了。啊,这种都考虑进去了,040对吧,这种情况啊。我们得考虑全了,万一他这个他不给呢。对吧,最后一个零他不要,或者说第一个零他不要。
20:01
对吧,啊,但是总得要一个啊,得取一个,如果不取一个都不取的话,你四百一跟四十一两个都省,前后都省,四百一跟41就区分不了了,对吧,但至少有一个。它是可以省的,对吧,我们把这个情况呢,都考虑进去,都考虑进去OK吧,好呃,那咱们怎么做呢,首先按照这个分割。按照这个分割取到一个数组,对吧,然后呢,我们取什么呢?取后面一个。减一。啊,取X减一,其实就直接取二也行。对吧,直接取二也可以啊,不是取一啊取一对吧,长度肯定为二嘛,对吧,按照点分割长度为二,那我取一也行,就是取第二位取的谁呢?取到它,因为我已经把Z干掉的基础上,对吧,取到这个值,取到这个值以后呢,我在后面追加三个零,然后呢,取前三位。啊,在后面追加三个零,取前三位,那这个防止什么情况呢?防止我们所说的这种情况,就这个。
21:07
假如说你是九百五对吧,九百五呢,它有可能写的是九五对吧,九五注意这个呢,可能是950,我们按这个来算啊,九百五对吧?好,那我们看啊,这个东西怎么取的,比如说95也好。还有这个095也好。对吧,这两种情况啊,那我们呢,怎么做的,首先呢,追加三个零啊,因为你无论多少倍,我都把那追加三个0095000。对吧,好好,那么接下来呢,取前三位,哎,那这个是950这个呢。交。啊,这个就是095。对吧,这个就是095。啊,是这样取的。啊,这样取的,那把它变成一个一个去乘以一个。1000啊,你直接乘以1000,其实也可以。
22:04
对吧,啊,把这个部分去处理一下啊,那当然这一点啊。这边呃,还是一样的,把前面把这个变成in对吧。啊,把它变成一乘以1000啊,然后这边呢,是正常的处理成这个TS就好了。对吧,这边正常的处理成这个就好了,哎,这边好像写的有一点点问题是吧,我看一下啊呃,把这个值。取出来。把它变成一个。Inr。那应该就够了呀,这边我怎么还成了1000了,我看T1。把T1乘以个1000,这个不需要吧,这个T1就不需要了啊,这边多了对吧,这个乘以1000有问题啊。这个是不需要的,对吧。对,这个有一点小小的问题。
23:01
啊,这个乘1000是。不需要的。对吧,这个乘以以前不需要的,好,呃,我大概知道方总你想表达什么意思啊,就是说095啊,来,我给你看一下这个095啊。方总呢,他可能是这样的095啊,这个呢,我告诉你啊in.past。这个其实你直接转就行了。能明白吗,黄总?对吧,其实你就想问这个前面一个零对吧,这个不用管啊,他直接转就行了,看见没。这肯定要095跟九五,它在这个数字里边是一样的嘛,对吧?呃,这里面稍微改一下啊,这个乘以1000不要啊,这乘以1000不要。对吧,啊,乘以1000不要啊,因为我们这个是毫秒啊,这个毫秒好,那最后呢,最后就是比较它们俩,其实核心的思想就在于把它拆开,对吧,拆开之后呢,再处理啊就好了,呃,那这个呢,我们就做掉,接下来呢把它打开。
24:09
注意一下,那这个地方呢,就不要乘以这个1000啊,不要乘以1000,当然你乘以1000。也可以,他不会影响结果啊,他不会影响结果,因为两个人都扩大了1000倍嘛,对吧,啊,假如说你两个人前面不一样,那肯定是年月日就比较出来了啊,十分表就比较出来,对吧,如果说前面两个是一样的。那你都乘以1000,那也无所谓对吧?啊,所以最好那就其实没必要,大可不必对吧?好,那接下来呢,这个东西我们运行一下,我们比较谁呢?比较它俩040跟零四,它俩呢,应该是怎么样。应该是一样的,对吧,大家看啊。一样的,应该返回什么?返回零。一样的就返回零对吧,啊,因为相同嘛,相等啊好,那041这是后面的。
25:00
后来的的后来的呢,返回负一。对吧,后来的大返回负一,那反过来诶032对吧,我们三个都测一下啊,三个都测一下走。哎,不对,我嘴上说042,然后扣了一个041是吧。我是说怎么返回零呢,哎,这个就一对吧,三种情况零一负一嘛,对吧,这个没有问题了吧。啊是这个啊好,那其实核心的思路呢,跟大家聊一下就行了啊,咱们拆开,拆开之后呢,处理一下啊。好,那接下来呢,我们写这一块的一个。代码按照刚才我们在PPT上所看到的一个逻辑对吧,比M。好,那么第一步。获取执行环境。要。读取这个成功。啊,DWD层。
26:03
成功支付主题数据创建流对吧,好,那接下来第三。将数据转换为接算对象,因为方便后续处理,对吧,这边呢,我们可以做一个。过滤啊,你要以防万一嘛,有脏数据对吧,当然其实到这一步我说了,你现在支付呢,你前面已经做过了啊,你这块也可以。不做过滤了啊,当然。不放心。那肯定可以再做一下对吧。好,那这个转化为切森对象以后,咱们就考虑做这个第一次驱虫,对吧,那咱们呢,第一次驱虫。首先。得干什么。按照这个。订单明细ID分组对吧,做这事好,那第五步。
27:06
使用状态变成。获取。啊,就保留最新的数据输出。对吧,我们保留最新的数据进行输出就好了,就是最后一条吧,对吧,相当于是我们那个最后一条啊,保留这个数据输出。那这个数据我们输出好了,接下来干什么事?这是我们的编程这块吧,对吧,用一个定时器那块啊在这对吧,好,那第六提取时间,时间生成。Worldmark。好。那第。七步。好,第七步。呃,那接下来呢。我们都有这个,我然后按照。
28:00
User ID。分组对吧,又一次分组。啊,这一次分组干什么事呢?提取。独立。支付成功用户数啊,这一步呢,第八步。很简单,我们都写过很多次了,对吧,好,那这个已经提取到了,也就是说已经转化为我们的扎病了,对吧,接下来呢,开窗。聚合。将数据。写出道。好对吧。这个启动任务。写的我就好了,对吧,这是我们整个这个流程啊好,那第一个获取我们的执行环境,我们呢去拿一个好,第三要板从这里边拿也可以啊,这个都行。
29:04
拿过来,但是呢,跟这个table in没什么关系啊,直接把它干掉对吧,第二个。读取这个DW层成功支付数据的数创建流,那这个呢,主题我去拿一下啊。呃,支付成功的主题对吧,消费者组啊,那咱们呢,把这个加一个。好。D得到一个卡夫卡的一个DS对吧,接下来转化为这个接送对象啊,考虑到一个数据呢,呃,可能我们要做一个处理对吧?点。Map。啊,点map。我们同时还要做这个过滤对吧?啊过滤的话,那我们就用这个直接用map吧。弗莱,然后呢,杰森啊,如果说你不做过滤的话,你就直接写。
30:04
刚才那个map就好了,对吧,但是你要考虑到用这个过滤啊,你要防止有这种脏功率,咱们可以这样写一下啊,那加德这边杰森。点pass object,然后那加得到一个介object啊,当然这个东西呢,你防止它出异常情况对吧,Ctrl out加T啊做一个try catch啊做一个try catch这边呢,就直接SOSO对吧。我也不写特殊入流了,因为我用的是Fla map啊,当然了,你要用的是。你要。用测输入流,你得用process对吧,你可以把它写到测输入流里边,这个我们就不做了啊,那正常的话,它没有异常,那就out点。这个接上object。好,那这边呢,我们就过滤。加转换结构就已经得到了,接上OGDS对吧,接下来呢,按照。
31:05
订单明细ID进一分组,那K对吧,杰森,好,那咱们找一下这个订单明细ID到底找存段叫什么。注意啊,这个是支付成功,我们肯定要这个对吧,要这个主题,最后呢,找最后这张表就行了,这张表订单明细ID叫他叫all detail ID对吧。然后呢,杰森点get啊。往那一放,那我们就得到了一个叫JOJ。Kid by。这个detail ID对吧,因为这里边呢,我们有两次分组,所以呢你要写K的swim。那等会儿下面就。写不了了,你比较麻烦。对吧,好两个呢,你就只能写一个,所以呢,这边呢,我们就要加上a key detail对吧?哎,按照这个detail ID分组的一个流OK吧,这块呢,咱们就搞定啊。
我来说两句