00:00
好,那接下来呢,我们看这个叫交易日加购各窗口汇总表,又是一个没有力度的。对吧,所以直接。聚合啊,这是加构,我们要求什么东西呢?啊,那很明显是加构了嘛,读取加构明细数据对吧,然后呢,统计各窗口当中加构的独立用户数,哎,一看到独立用户数。有两个字,就应该立马蹦到你脑子里边是什么。啊,是什么。驱虫对了啊,这个呢,呃。统计。各窗口加购每日吧,应该这个每日啊每日对吧。就是还是按天去去重啊,还是按天去重OK吧,啊,那这个需求又简单了又好做了,对吧,我们家还是维护一个。
01:00
状态。啊,还是维护一个这个日期的状态,然后看如果日期没呢。或者这个日期与。当前的。数据日期不同。对吧,啊,就这个,如果等于呢,或者说不等于当天日期,那就保留并更新状态,否则丢弃不做操作对吧,就这个点啊,最后呢,补充重复时间对吧?就这个事儿啊,很简单,我们已经写过太多次了,所以这个需求呢,又没什么太多可说的了啊,这个需求分析,然后接下来呢,这边这个画的还挺复杂的,因为它里边有这个。状态对吧?啊,所以我们稍微的去搂一眼吧,啊,这个需求说实话写到现在为止已经非常熟练了啊,加个明细对吧,然后呢,转成结算对象啊之后呢,设置这个水位线。好,按照。Uzd进行分组,对吧,因为要驱虫嘛,好好,那接下来驱虫逻辑在于我们所说的。
02:01
啊,这个点对吧,呃,如果呢,你呢,等于等于,那或者两个不等,那这个呢,我们是要。保留的对吧,确实是这样,要保留的更新状态,否则就。丢弃掉。否则就丢弃掉对吧,好,那这个完之后呢,我们过滤出来这个独立的架构记录啊,加记录之后呢,可以。把它怎么样?对吧,这是说明啊,这个不用看了,我们都太熟悉了啊呃,开窗聚合对吧,在这一步的时候呢,我们可以进行一个。转换结构对吧,转换结构啊,开装去和还是一样的啊,那最后呢,写到house对吧,太简单了,So easy啊,没什么太多可说的,写写太多次了,主要是看这就是我们所说的,当你一个代码呢,你敲过很多遍以后,你会发现这个东西真的,你第一次可能觉得诶,还能这样玩,对吧,还挺难的,但是当你敲多了以后,你就觉得,哎呀,这好烦人啊,怎么还要写这个东西。
03:00
对吧,就会有这种感觉,我希望大家对于所有代码能不能敲到这种程度,那就好了。对吧,那你为了找工作啊,就算在疫情期间,你呢,出去工作,出去找工作绝对是能干掉一片的存在,对吧?唯一的竞争对手就是什么呢?就在你身边。啊,就是你昔日的同桌前后桌啊,如果说你能互相卷,把他们前后左右的人全部干掉,对吧?那你就你将是无敌的存在啊。那就是代码的编写了,第一步还是在建表啊,这个字段呢就好了,对吧,窗口时间一个数量一个。版本号啊。好,那这个东西有了,接下来呢,我们把这个扎并拿过来啊。
04:03
诶往那一放对吧,那接下来呢,我们到DWS层里边创建一个类啊。拿一下咱们的类名诶。啊,拿一下类名啊内。好,那我们剩最后一块东西呢,我们快速的去写一下PSM。第一个。获取执行环境。第二。读取啊卡夫卡这个DWD仓。加构实时表啊,加构实时表对吧,好,那第。三步。将数据转换为。街上。对象。一四提取事件时间生成water。
05:04
Mark,对吧,我们要做这个事儿啊,好,那这个有了。然后按照。User ID分组。好,按照UD进行分组对吧?啊。第六步使用状态编程,提取独立加构用户啊,那同时要转换数据结构对吧?第七步开窗。句号。将数据写出。然后啊一个。启动。好,那第一个。
06:01
环境。第二个。我得拿一下啊,这主题呢,跟这个我就不行。哎。MY卡YouTube卡D,对吧,得到一个卡DS,好,接下来转化为这个切词去像他把DS.map。这边呢是一行数据,或者说咱们直接这样写啊,杰森冒号。Pass object对吧?啊,得到一个切OBJDS对吧?好,然后呢,提取这个事件时间生成我们的what mark,好,那杰森。点a sign and old marks啊,那这边呢,还是一样的,我们给他两秒的。哎,怎么是这个。
07:00
Duration对吧?两秒的延迟啊,这边呢,是杰森啊。诶。那多,很烦。呃,那这里面呢,我们要去找一下,我们还是不用这个TS,因为其实加构呢,它也有自己的这个创建时间对吧,所以呢,很简单,我们找到加构表应该是在我们交易域这个看I对吧,这个它啊它的话我们往后翻啊在这边。呃,这是cut at对吧,没有问题啊,呃,它里面有两个时间,一个是create time,一个是。Operator。对吧,呃,一个呢是创建时间,一个呢是修改时间。啊,一个是修改时间好,那么这一块呢,就有讲究了。
08:02
对吧,因为当时我们加购的时候有两个条件,大家还记得吗?就是说新增数据。我们怎么样,我们是要的。对吧,啊,他要新增数据或者更新数据,我们也要,那就会导致一个问题,如果你都用这个创建时间,那不对。对吧,那也就是说有时候呢,我们要用创建时间,有时候呢,我们要用这个。操作时间。对吧,他有没有加,诶有没有减。啊,有没有减类似这样的一个情况。对吧,好,那我们怎么做呢?很简单,我们呢,这个数据既然只有两种啊,它要不然是新增,要不然更新对吧?呃,更新的数据呢,且。我们SQ一定是。处理了对吧,所以呢。很简单,我们就看他呢是否为none,这个operator time是否为none,如果它不等于none,那我就用创点应用这个修改时间,如果oper time等于none了,那我就用创建时间,能听明白吗?
09:06
就是由于我们之前这个地方新增加更新都有,它不止新增对吧,所以你不要只用这个。创建时间。对吧,他有可能呢,是这个。用的是操作时间对吧?所以很简单,我们呢,就直接看操作时间是否等于呢?如果操作时间不等于呢,那么就用操作时间,如果操作时间等于,那那么我们就用创建时间,能明白吗?因为它只有这两种可能性,一个音色的,一个update。能不能明白?这个点啊,是要一个小细节要注意的啊,不是直接拿着这个create time就拿过来用了,不是这样子的。对吧?啊,当然你要偷懒啊,你在这里边加一个mal的TS对吧,你用那个TS其实也可以啊,你用ma里面的TS其实也可以啊,这个倒还好,对吧?好,那么接下来呢,这边我们就。
10:03
来啊,先按点get。Three。对吧,叫操作时间,那这个呢,防止写错,我们去拿一下啊,这是最后的一个表是吧,在这啊叫操作时间啊,往那一放。诶叫time。对吧,好判断。If。Time它不等于,那哎,那我们就要用这个时间了,对吧,那我们就返回。这个什么呢?Date for ma you.to ts叫time对吧,然后呢,给他一个处啊,因为在加构数据里边,我们大家看一下啊加构。Cut at c在这对吧,Cut info,诶。就是这个啊啊,那这张表里边呢,它有这个创建时间啊,操作时间,我看一下有没有。
11:06
诶操作时间都是那什么,呃,咱们这次造的数据都是,那那其实它这个时间呢,跟这个一样,格式肯定是一样的,对吧,也是个年月日十分秒啊,所以呢,咱们这个地方呢,用一个处。啊,用一个处对吧,好,那否则。我们怎么办呢?叫data for.to ts,然后呢,从element.get create。碳哎,用创建时间这个就不要了。这个细节要注意一下对吧,因为有可能呢,咱们是一个。修改的数据被我们读到的。对吧,好。回正这边呢,就得到了一个。杰森OJ。With。我。
12:02
云总咋了处?有问题吗?它是年月十分秒嘛,所以说是全的对吧,因为这个叫is for是否是全的,是否是全的,全的指的是。Else。是什么东西啊?啊。哦哦哦,这。啊,我懂了我懂了,就else里边加这个处啊,我还以为你说这个处呢,所以我刚才弄了一下没反应过来啊,感谢这个云总提醒,要不然的话又会报错了啊,报错之后呢,嗯,得得找到这个问题啊。好,那这是我们提取完这个whatmark啊,好,那这个就解掉了,那么接下来呢,按照user ID进行分组,那with what曼点s.T啊,这里边呢是一个杰森对吧?呃,那use ID我们看一下,哎,就在这吧,直接就叫user ID,也不用说他也没有嵌套,他直接拿这个uz ID就行了啊,那就杰森点。
13:10
Get three啊叫user ID对吧,这样的话呢,咱们得到了一个监控。呃,提取我们的目标数据啊,这个收益的点。莱曼。Rich。这个地方叫cut at。呃,那这边呢,很明显咱们要做一个private。然后呢?String。对吧,那last。Head。State。啊好,那我们要求的是每日啊,比如说我们要求的是这个。每日加购的一个人数,那我们很明显要用到这个TT了,对吧,TTL啊,那TTL,那我们就来直接写一个有一个这个T。
14:10
看这吧。啊,肯定还是要用它啊,啊,那么这边呢,Builder里边是他。一天啊每天嘛,还是一天啊,啊这边更新啊写一下。其实这个更新啊,我可以告诉你可以不写啊,可以不写,为什么呢?因为默认的是它,默认的就是它,但是一般来说呢,我们还是习惯上把它写出来啊,这样更好一点,那接下来你有一个这个。Value state对吧,这里边呢,放这个啊这个描述器。啊,那这个是last。Cut啊,上一次的这个cut。点class啊,看加宾得到一个state,那接下来我们就可以去写了,对吧?嗯,那statescript。
15:08
Enable time to leave,哎,把这个t t conflict给它放进去。好,那之后呢,是我们的last,哎,然后呢,用运行时上下文去获取一下,对吧,把这个。Stay discover放进去啊好,那这个呢就搞定啊,搞定好以后呢,接下来就好写了,那还是一样的获取状态数据以及当前数据时间啊。获取状态数据以及当前数据的日期。啊,那就是。点Y加倍得到一个叫拉。啊,就叫last dt版啊,不取那些奇奇怪怪的名字了啊嗯,那接下来呢,是我们当前数据里边啊,value.get。
16:02
TS。For。哎,不是t to。Date对吧,To date啊到年月日啊,那TS放进去看见没,咱们就得到了一个current。DT,当天时间,那还是两个条件对吧,If。呃,Last TV,它呢,等等于no。或者这两者呢,不相等对吧,点equals car dt不相等,那这个呢,咱们的数据那都是。一啊,那都是一对吧,那你都是一的话,那我们就直接可以在这进行输出了,对吧,把这个状态更新一下啊呃,Last at state点。他不对。来更新一下,然后在这里边呢,哦点。Connect,一个叫。病对吧,第一个窗口时间,第二个窗口的结束时间,第三个是一个E是我们要的一个数据,对吧?啊,那第四个呢,是我们的一个TS。
17:09
先把它写一下。可以吧,啊,咱们这样写一下,我也没有定义一个变量呢,因为只有他一个人,我还定义什么变量呢。对吧,那我们要的数据我就写一个一出去就好了,那我不要的我也就不管了,对吧,我后面呢也不用判断,说if这个东西等于一我再写出去,因为他只有他自己,我是不是可以写在这个判断里边了,对吧?以前我们怎么做的,在外面定一个变量A为零,对吧,这里边呢改为一,在后面呢在判断,哎,如果你是一怎么办?对吧,零怎么办?只有他自己,我还搞那么多干嘛呢?来判断两次没必要了吧,对吧,以前呢,我们是有多个值嘛啊,我们有多个值的时候呢,我们确实可以那样去做一下,对吧?啊,有多个值的时候可以分两步来写啊,那现在只有一个值,那直接这样就好了。啊,没什么好说的,对吧,大家得到一个叫cut。
18:02
Death。Color对吧,好,这是我们的。驱虫啊,这是我们的驱虫啊。嗯,那接下来呢,就cut at DS点。还是温all呗,对吧,点off time.SECOND10秒。点。他二倍对吧。好,返回Y61这边。加二点。Get啊好,那这边呢,是我们的这个数据,这这就还是分点三步对吧,Value点。
19:04
啊,最后呢是out.connect next对吧,中间呢,补充一下这个数据就好了,呃,Next。点。啊,E dt对吧。的悠久点啊,你十秒温点。点get started。Twenty minutes OK,搞定啊,这样的话我们就得到了一个DS,好好,那接下来呢,这边。点。I think。
20:00
呃,这边呢,给个色音色音。Y64啊,那也就单个值对吧,那就是四个。窗口时间加一个单个值,再加一个TS,表明拿过来。好。而是把它。拿一下。往内放对吧,搞定啊,这个就现在来说,你们这个代码还不能敲的很快吗?还是有问题,呃,它的一个测试,那它得来自于cup的这个数据对吧,哎,把它。上面这个拿过来。加一点东西。啊,这个东西呢,我就想从这拿了。
21:00
对吧,接下来呢,是他自己。最后到了一个。依赖于这个ZK啊,那我们要启动的,其实服务端的东西已经启动了,就是把这个看艾给它吸起来对吧,然后呢,起他自己之后呢,去看这个效果就行了,还是造数据啊好,那看ADD啊。诶,我加错地方了。回了我怎么加到这儿了对吧,这个不对啊,应该这个东西呢,加在这个地方才对啊。好,这儿呢,也一样的把它。拿掉。你加到这才对吧,应该是这个吧,咱们开窗的这个对吧,这是DWD层,应该加到DWS啊,DWS在DW基础上OK吧,好看艾来运行啊。然后呢,是这个DWS的卡。用户对吧。
22:01
啊,这个是我们加了那个烟V点对吧,我说呢,那个其实可以干掉,可以干掉对吧。我还以为刚才我们写的这个类报错了啊,是之前我们那个问题啊好,那这个时候呢,我们去造数据,那当然这边呢,我们可以先写上新。From。这张表对吧,好来造数据啊,来找你,但是这个地方呢,也一样的,我们最好都要造两次,间隔十秒以上造两次对吧。这边做完了你来,诶这边控制针了,我看一下什么情况,咱们的代码还真有点问题是吧,我看一下这个空指针在这。呃,是哪儿?
23:02
Date for new,一个date。Value点。Get along,哦,傻了,我说了不要没有这个TS对吧?这块不对啊,这个地方怎么能这样用呢?这个错了啊,这个得改一下,呃,刚才我们还说到这个问题了,对吧,这个里边呢,咱们我当时自己写的时候,我是没有用这个T的,对吧,这里面没有这个TS啊,习惯上用TS了,我们应该用谁啊,还是用这个创建时间或者说这个操作时间吧,还是得用它,对吧,得判断啊好这边呢,我们还是提取这个东西啊,这个不能这样写。该怎么做呢?把这个倒过来。Value啊,那这个呢,是操作时间。
24:00
对吧,这个是操作时间OK,好好,那这边呢,咱们这样。If。Time。它不等于。那。啊,它不等于那对吧,那么咱们呢,就是把这个operate time点。Li。啊,Li按照空格分割,因为我们要的是日期对吧,按空格分割取呢第零位,这就是咱们那个日期啊,这个呢,我们定一个叫string类型。Current dt。啊,咱们呢,先给他来一个什么,那值啊,先来一个浪值对吧?好,那如果你不等于捺,咱们就这样来做对吧,这个这个就不要了,这个不需要啊好,那如果你等于呢,怎么办呢。对吧。啊,接下来呢,我们去获取谁啊,这个创建时间啊。
25:05
对吧,这边呢是create time。Time。对吧,好,那如果你的。操作时间等于呢,那我们就CRDT等于。这个地方呢,用创建时间点split按照空格切分取定零位。对吧,因为你本身就是年约是十分秒了,所以呢,我们就不需要做这事了,对吧?好,那这个就搞定了,接下来关于这个问题怎么办呢?这个TS对吧?这个TS呢,你可以拿着上面那个转一下,当然了也可以不写,对吧,因为我们关于这个时间中已经提取过了,在这就已经提取过了,而且呢,到最后这个位置我会重新给,所以这儿呢,你给个馕值是不是也可以。对吧,反正最后到这个位置,咱们会给一个系统时间,这样呢,你给那值就行了,因为没有,因为之前有我就刚好放进来了,对吧,没有的话,那你就给个那值,因为它不受影响。
26:03
呀,好,那这里边儿还真有点问题啊,就是我们这个时间的问题,对吧,来我们把这个。尽量来运行一下啊。接下来呢,我们来造这个数据啊。找你。等这边做完,我们到里面看啊。呃,这应该是上面一次的数据对吧,你看现在都15:02了,现在是14:58的数据,看见没,对吧,说明我们挂掉以后是不是会重复消费啊。对吧,这个我们可以看到可以重复消费吧,因为上一次我们消费者数据没有打印输出嘛,这个肯定不是刚才造的,刚才造的15:02了,对吧,那我们再过十秒啊,现在应该差不多了,对吧,我们再造一次,他肯定是15:02的结果,对吧。
27:05
啊,这个也能证明他确实可以重重新消费,刚才是挂掉了呀,对吧,任务跑到中间挂掉了,但是呢,我们造的数据它会重新去消费啊重新消费诶那这个就15:02的没有问题吧,啊就是这样的一个效果对吧?啊刚才是关于刚才那个时间我们处理的有点问题对吧?好,那这块呢,整个的测试搞定了啊。
我来说两句