00:00
好,那接下来呢,我们看一下我们的第五个需求用户。注册。啊,这个窗口汇总表对吧?嗯,注意它也是一个用户,用户注册这个就太简单了啊,因为什么呢?因为我要从DWD的用户注册表当中读取数据,然后直接统计注册用户数。这里边儿连数据加工都不需要做了。对吧,我们连数据加工都不需要做了,就很简单,就是来一条累加一条啊就是开装聚合,做一个word count就结束了,什么都不用管对吧?啊那这里边呢,读取数据转化为接散对象之后呢,水位线设置我ma对吧,之后开窗聚合,然后呢,写到click house就结束了这个需求,呃,过于简单对吧?好,那咱们呢,快速的把它实现一下啊来把这个拿过来。诶,在这啊。呃,这第一个,第二个咱们的user b啊,就是。
01:07
用户的。注册。用户注册的一个招聘啊,拿过来对吧。这个需求讲道理啊,过于简单,So easy是吧?好,那接下来DWS层当中,我们再来一个这个类啊。把这个。往那一放。好。那我们快速的完成一下,其实说实话这玩意儿我都不想写了,没什么意思,对吧,这个需求啊。呃,第一步。获取执行环境。第二个。读取卡夫卡叫用户注册表DWD层对吧,DWD层啊。
02:03
叫用户注册。主题数据创建流对吧,好那。第三步。将数每行数据转化为切算对象。好,那第四步。提取时间,戳生成。我嘛啊,那接下来就是开窗聚合,注意它也没有力度,所以呢,也就没有这个分组了,对吧,所以直接就是开窗。聚合。直接就是开窗聚合。OK吧,好,嗯,那。接下来就是。第六步,将数据写出到。
03:03
Click house。对吧,第七。启动任务,启动任务OK吧,好,那第一个呢,我们就直接去拿一下啊在这边。呃,第一个拿它啊。啊,拖不上去。他。好,第二个。转化为就是第二个读取这个数据啊,那拿咱们拿一下这个主题。拿下这个主题对吧?好,那将每行数据转化为接送对象,其实我们都可以不用转化为接送对象,我都想一步到位,直接转化为谁呢?转化为这个招聘啊,转化为这个招聘,因为这CT对吧,那未来呢,我们肯定还是要把它转成这个。
04:10
招聘的啊,就来一条计算一条,来一条计算一条,对吧,那我们不如说直接转化为这个招聘对象还好一点的。对吧,转化为聘对象啊。我们唯一的就保留这个谁呀,保留这个TS对吧?啊,因为他是已经经过驱虫了,就不用管了,因为他来的数据呢,就是这样子对吧,好这边呢,Env.source叫my KA YouTube点卡的一个consumer。啊呃,Topic,然后呢,Group ID对吧,唯一的就是把这个加一个消划线,呃11126啊好,这个就搞定了,这样的话呢,我们就得到了一个卡夫卡的一个DS,接下来把它转化为我们的一个。
05:01
对象招聘哪个对象点卖对吧,这边呢是一行数据。首先呢,肯定还是把这一行数据呢,把它转成这个杰森啊,因为咱们还是要提取里边的时间戳嘛,对吧,最后呢,返回另外一个这个叫user。好,那第一个空,第二个先也给空,没办法给不了对吧,然后这个呢,给EL每条数据呢都是个一,最后TS我们得从T点开了。然后呢,把这个TS拿过来。对吧,咱们所需要的数据就是这个TS啊,提取这个实践时间用的啊,二加V得到一个usered DS。对吧,这个就搞定了啊,接下来呢,提取这个wordmark.a sign。啊,那咱们还是给他一个两秒的延迟可以吧,叫病啊这边呢。
06:03
OF2秒。这边点。有一个civilization的一个time对吧,嗯,element.get ts啊把这个时间。拿过来。就好了,诶这边不对不对,这个地方有问题,因为我们现在是用户注册对吧?啊不是之前那个数据的这个不对啊,这个呢,咱们得找到这个数据啊。不能这样写啊,这个地方有问题。啊,突然想起来了什么问题呢?来到DW用户注册这边,我们要找到这个字段啊,这个不对啊,看最后的字段写出写出去啊。我们现在呢是create time对吧,其实呃,这个TS呢,我不想用啊,为什么呢,这个是。麦克斯要给我们加的,我当时就提过这个事儿,对吧?这是麦克斯要给我们加的,所以我不想用,那真正的这个时间呢,其实应该是这个创建时间,能明白吗?所以呢,我不想用这个TS啊,我突然想起来这个事儿了啊,不想用这个TS呢,是麦克要给我们的,能理解吗?
07:12
就是最原始的这个数据啊,这个就涉及到久远的Maxwell这边的一个数据格式了,对吧,那这个里边我们这是一条数据对吧,那么它里边确实有这个TS,这个TS谁给的。是不是麦克斯奥给的?对吧,但是呢,其实我们数据里边很多数据里边啊,他自己都有这个创建时间。对不对。所以呢,我突然想起来这块呢,我不想用这个TS,这是麦克给的,对吧,我要用的就是这个create time,它呢是这个年月日十分秒啊,那我们可以来看一下在这边。用户注册。对吧?啊,那我们找到用户表啊。
08:01
Li,然后呢,User in for在这个位置啊,User in for,然后呢,有一个这个创建时间对吧。对吧,它是这个年月日十分秒,那我们呢,用它会更好一点吧,这是创建时间嘛,对吧,用这个啊用这个不要用macel了,所以呢,我们就用它啊啊那用它的话,这边我们稍微的调整一下啊,这个就不这样写了,这个干掉啊啊那咱们怎么做呢?在这边。首先呢,从杰森当中点get string对吧。先获取这个叫。At ten,哎,先把它拿到对吧,哎,创建时间,那接下来呢,我们要把创建时间改一下,就data for.to ts对吧,Create a time,诶这个地方呢,给一个处啊,就是我们这个数据格式啊,注意它是什么,它是YYYY杠五看D。对吧,它是年月日十分秒,所以呢,它是全的,那我第二个位置呢,给一个这个处。
09:05
啊,第二个位置给一个处OK吧,啊,那我们用这个,我突然想起来这个时间呢,我们用它会更好一点啊。对吧,这个时间呢,我们用这个create time更好一点啊,而不要用那个TS啊,虽然我们也能获取到S,但是你要知道那个TS呢是。麦给我们去加的啊,所以呢,就不要用,我不喜欢用那个啊,因为这个才是真正的,我们可以认为它才是真真真正的用户的。注册时间对吧,诶事件发生的时间,就这个才是才是最真的啊好,那这样的话呢,我们就得到了这个。User register。然后。Word DS OK吧,好,那把这个拿过来,拿过来好,以后呢,开窗聚合,呃,没有分组,那只能用window or,还是一样的对吧?呃,他们的even time window点。好。
10:00
这边。他点second,还是这个十秒钟啊,还是十秒窗口,然后再聚合video,有一个video这块都写烂了,是不是真写烂了。有病啊。好。嗯,那么这边呢,咱们直接返回Y61啊。好把两个注册一往这一放,接下来呢,三步对吧,嗯嗯,Values点。user.set ST,对吧,呃,Window for点。
11:06
Window。Get stop。Edt。Window点。最后二点,Connect。哎,把它呢,再写出去对吧?啊,这不就搞定了,我们就得到了最终的without DS without DS啊啊,那么接下来呢,把这个数据呢,写到克house里边啊,这个很简单,DS。咱们呢,还是在这边做一个打印,因为这样的话呢,方便我们观察结果,对吧,很快的啊,点ADD think。乖。推好这个点啊,先把这个里边能写的写一下in色。Into。
12:00
Y64啊,这个呢,有几个扎聘看一下啊呃,四个子弹对吧,这个就很少了啊。四个子弹,好,那我们接下来拿一下这个表明刚才呢,我们已经创建过了,在这啊。往里放啊,前后有空格,那没有问题对吧,最后呢,在这边我们可以把这个写上他的心。From。这张表,但是现在肯定没有数据没有问题啊,嗯,接下来呢,Env.Q。把这个。拿过来。诶往那一放,这个就搞定了,对吧,这就是一个聚合,就是用户注册的一个需求,很简单啊,没什么难的,就是里面都有,都之前都写到过,唯一的一个点呢,就是这个你要注意一下,我刚才差一点都搞。搞忘了对吧?啊,我们用的TS,当然用TS呢,它也不会报错啊,但是呢,就是不好,我建议呢,就是数据里边,假如说你这个data里边本身就带的像这种时间,那你就用这个时间,这是最准确的,对吧,除非没办法你没有,比如说就刚才我们看到这个数据啊,假如说呢,我对于这个。
13:07
而言被trademark这张表,假如说我也要做一个什么实时的指标,对吧,他呢,Data里边它没有这个什么创建时间,操作时间,那怎么办呢?我就用TS对吧,就是没办法的时候你才用这个退而求其次。能懂吧,啊就是如果说数据里边有。那你就不要用了啊,你就不要用,你就不要用这个TS了,能明白吧,对吧,一般这个东西我都很少用啊,因为毕竟是macel加的啊,那没有这个数据里边的来的准确啊啊。呃,这块呢,咱们就搞定啊,你看。好,那这边呢,咱们还是一样的来做一个测试啊,那这个它是来自于哪啊。来自于我们的叫DW user register这张表对吧,所以呢,很简单,我们就DW user register,我把这个呢拿过来。
14:00
啊。往这一放,再加一个叫link APP对不对,然后呢,最终把数据要写到叫clickhouse,这个呢是咱们的DWS。对吧,好,那这个弗lib呢,就是他自己。就是他自己对吧,接下来往克号去写,那科学号子拿过来,好,它依赖于这个ZK啊,好,所以呢,我们把这个写上,那接来我们看一下我们启动东西啊呃,ZK卡不卡,那不用聊,都是启动的对吧,House启动的啊,ZK也写了,那接下来我们要去开这个麦cel,因为MYS是开机自起的嘛,这个无所谓对吧,那我们就要开这个mal,最后呢,造数据就好了。啊,就差一个macel了,当然在Windows上面呢,要开这个还有他自己对吧?好,那我们先把这个mal打开啊。其实我们F1可以关了,因为后面呢,都没有这个。日志数据了啊,都是这个业务数据了啊,所以我把一关一下了,麦克L启动了在这啊。
15:05
对吧,呃,那这个东西呢,我们可以多看两眼。对吧,他也没有挂掉,没有事啊啊,那接下来呢,我们就等着在这边去造数据啊,这边造数据呢,要切到这个DB log里边,对吧?啊在这去造数据的好,那么这边呢,我们来啊。我们怎么做呢?这边把这个user把它打开。把这个打开。那这两个呢,我们都打开了,接下来我们造数据这一块,造数据的时候大家一定要注意一下we application啊呃,你造数据的时候呢,你注意这个东西。
16:04
之前我们在DW上做测试的时候就说过,对吧,你这儿不要写零啊,你要写零的话,你就看不到这个效果。能懂吧,这你不要写零哈,你不要写零啊好,那业务数据第一个需求对吧,那咱们呢,这个呢,我也改成5月24号可以吧,啊那未来我们测数据的时候呢,我们都用5月24号。日志跟这个都是五月24,只有最后那个数据,我们用的好像不是五月24,因为那个要看回流嘛,没办法对吧,所以我们调到6月3号了,但其他的都是5月24号,而且他5月24号也有数据,所以这样的话呢,未来我们做测试的时候就不用来回去改时间,我们统一的用一个时间,这样是最好的,好这样是最好的,OK吧,好,那我们造20个,那就造20个呗,无所谓,对吧,好保存啊,保存好以后呢,我们来Java。杠,这叫j Mo DB对吧,走。
17:03
但是这个造一次一般看不到效果。因为。我们数据之前说了,他是统一造好,造好之后呢,统一写的,你看着他好像经过很长时间,但是他在造这个用户数据的时候,时间几乎相同啊,时间几乎相同。并没有数据看见没并没有啊,那要怎么做呢?就是我们等个十秒。等个十秒钟,再造一次。能懂吧,啊,等个十秒钟再去造一次这个数据就好了。能明白吧,啊,你如果不等十秒钟那。就不行,因为我们窗口是十秒啊,这个时间肯定够了啊,再走一次。那注意这次打印的是上一个20啊,这次打印的上一个20对吧?啊,因为窗口嘛。好,呃,20个对不对,没毛病吧,啊,就应该是20个。对吧,你看刚才都25了,现在呢,是24分30秒到24分40秒,刚才都已经到25了,对吧,所以是我们前面一次造数据的一个结果啊好是这样子的,呃,那其实通过这个造数据呢,给我们引发了一点想法。
18:16
啊,我把这个抛下去,大家呢,下去去想一想,这个问题该怎么解决啊,什么问题呢,是这样子的啊。那你看我们DWS呢,到目前为止都是开窗。对吧,都做了一个开窗好呃。这里面就有一个问题,什么问题呢?如果说我做了这种按照事件时间开窗的这种需求,假设他需他数据没有了,假如凌晨的时候,对吧,他呢,没有什么数据过来。没有数据过来了。啊,那。最后一个窗口是不是就不会关,你比如说啊,我刚才造的对吧,呃,这这次第二次造的数据,你看他就没有吧,那要我第三次你看现在是14:26了啊对吧,我再造一次,它会出来什么结果呢?它会出来14:25的一个。
19:08
结果啊,当然也是20对吧,也是20,它会出来这个14:25,我们来看一下14:25吧,十秒到20秒,20个没有问题啊,啊,那也就是说我刚才如果不去造这个数据,没有数据栏,那么最后一个窗口永远卡着你,比如说现在我刚造的这20条数据,就是14:26,这二条数据它就永远不会出来,我如果不造数据的话,他们永远就不会出来。对吧,那。有一个问题要给大家,大家那生产环境当中遇到这种问题怎么办呢?对吧,呃,我不要这个答案啊,不要什么呢,有的同学可能说那这么简单吗?对吧,那你呢,我是流对吧,七到24小时运行,未来呢一定会有数据来。好,假设我下一条数据是两个小时以后来。我过两个小时以后了也来了,对吧,但是你这个数据呢,本应该第三条数据是应该是14:26这个数据吧,他要过两个小时才能输出,是不是他是不是要过两个小时才能输,那你这个延迟也太高了吧。
20:14
能明白这个问题吗?就是说。窗就失电时间开窗。对吧,最后一个窗口数据迟迟不来怎么办啊,由于没有数据,就是正常生产环境当中没有数据来,对吧?这种问题我们该如何解决啊?呃,下去呢,大家要去想一想。明白这个问题,能听明白吧?啊。这个问题大家能听明白哈。是不是以前从来没有想过这个问题?对吧,啊,根据实践时间开窗,这个注意也是面试题啊,面试里边还真的不是说特别高频吧,呃,但是也不是特别低频,它不属于那种特别偏的问题。
21:07
在面试的时候,是有很多同学被问到这个问题的。OK吧,一定要注意一下啊。好,就相当于留个作业,大家呢自己去思考啊,后面呢,我会去讲啊,我会去讲,我我留的东西肯定我都会讲,我不可能说就丢给大家去思考,我就就这样,就这么着了,那不可能对吧,我不是这种人啊呃,虽然讲课过程当中有时候呢会挖坑骗大家对吧?啊呃,但是呢。挖坑归挖坑啊,就是管杀也管埋好吧啊。
我来说两句