00:00
呃,这个地方呢,要用状态变程,然后呢,同时要有定时器,所以你就不用想了,这种情况呢,API不用想了,你只要看到定时器,或者看到这个测输出流,你就不用想了,对吧,直接用什么。终于大家可以。放心的说出来,我们所要的这个。API了。对吧。啊,终于可以说出来了啊。Process,哎,终于终于咱们要用process了,好好,那这边呢,就是用一个叫kid。Function。绝了啊,为什么绝了呀?名正言顺了,对,这个只能用它了,对吧,其他的你用不了了啊好,那输出数据,输出数据呢,呃,就保留一个数据嘛,当然还是。杰森。Object,当然你也可以不写啊,因为这里边呢,我们其实没有输出啊,我们没有输出对吧,我们并不会在这儿进行输出。
01:05
啊,我们要在这个。第17里边去输出对吧,好,那这边呢,我们注册一个。不是先注册电视啊,先搞一个这个数据对吧,那就是。A private,然后呢,找一个状态对吧。对的,诶类型呢,当然是杰森object,就是数据本身嘛,对吧,啊数据本身这个呢,就是什么value呢。呃,那就叫better得了,对吧,就是存正常的一个数据的啊,在open方法里边给它写出来。对吧,然后呢,他是杰森object。杰三加对吧,好把它拿过来好,那么接下来这边呢,我们来做一个。
02:05
处理对吧,先获取状态中的数据,获取状态当中的数据,那就是value。点。A value,对吧?好,这样的话呢,我们就得到了一个。状态。那首先呢,判断状态是否文档。对吧,啊,因为文档的话,那我们就要干什么事,我们要把这个数据呢。保存进去,且注册定时器。对吧,请出的这几啊好判断。状态是否为那?等等,那。Else啊,不等于呢,又该怎么做对吧?等等呢,我们要把这个数据存在状态里面,且注册定时器对吧?好,那就是。
03:02
点update,把这个value呢设置进去。对吧,同时呢,注册定时器啊,注册定时器对吧。那这边呢,咱们注册这些Ctx.time service.processing time对吧,用正常的处理时间就好了,因为你在生产环境当中那个。数据延迟,那其实也是这个处理时间的延迟,对吧?好,那我们给一个。五秒啊,给一个五秒啊,那怎么给呢?首先CDx.time service点。A current processing time加5000。对吧,因为前面呢,我关联的时候,我写的是五秒啊,那这边呢,我给个五秒就行了,对吧,这是更新状态,且注册这个定时器啊,且注册定时器好,那如果你不等于呢。不等于呢,那我们就比较。当前数据。与状态当中那个时间戳了。
04:04
对吧,我们要比较这个时间戳了,好嗯,那我们把这个数据取出来,那在哪呢?States。点。啊,该。Stream吧,获取谁啊,那个字段我们找一下啊,叫这个叫肉operate ts,注意啊叫它对吧,好这样的话呢,我们得到了一个state。RT,对吧,好,那当前数据当中呢,也有一个Y6点。Cat。String,哎也呢,是它对吧,好,那这样的话呢,我们就得到了一个。A current。叫什么?RT,哎,我们都叫RT吧。Rt time对吧,接下来呢,我们就比较它俩。谁大啊,把大的呢保留到状态里边就行了。对吧,如果是他当如果当前的大就替换,如果是状态里边大你就不用管了。
05:07
是不是,如果是状态较大,关键有一个问题。什么问题呢?如果它俩相等的。万一它俩相等的,那相等的话,我们得取一个对吧,那我就取后来的行吧。相等,我就取后来的。啊去当前这一条对吧,就就后来的我们就认为它更新一点对吧,好,那也就是说当后来的要大。啊,或者说呢,它俩相等,那都取后来的,那也就是说我只需要干什么。它还大就不变对吧,只要它不大。那怎么样?那就处理好,那比如说我们刚才写的那个类啊。这个比较类点compare,哎,那this rt啊第一个第二个car rt。啊,我们就得到了一个。
06:01
值哎,那我问大家,刚才我们测了啊,呃,这边啊,它返回一对吧,这个一是谁呀谁的。前面的大返回一。对吧,前面的大返回一好,呃,那这边我们知道了,如果说这个要大的话,它就是一。这样这个大的话就是一啊,否则。就不是一啊,这个它俩相等是零,后面大呢是负一,所以呢,这边我们就可以这样写了,If compare,如果说它不等于谁啊,不等于一。不等于一,不等于一说明什么问题,说明呢?因为等于一是你的嘛,不等于一就是你俩相等或者说你的。对吧,那后来的呢,那我们就都替换啊,都替换那就是value state.update把当前这个值呢,给它更新进去。
07:00
OK吗?对吧,因为我们考虑到万一他俩真的相等了,那我就取后来的,后来的是谁呢?是当前这个数据吧,这个是后来的,先来的在状态里边吧,先来的数据在状态里边,诶,那咱们呢,就这样处理一下就好了,对吧,只要他刚来的时候注册这个真实器啊呃,那这边呢,咱们就写完了啊,写完好以后呢,咱们还差一点东西,差什么,差一个电视器啊。嗯,啊。太电器的一个出发。对吧,当然这个保留在这儿也行啊,这个都无所谓。好,那接下来呢,呃,当地日记出发了,我们就输出那个状态当中数据,并把状态清空就好了,对吧,状态最后呢,你再清掉,因为你没有用了,对吧,好输出。并清空。状态数据对吧,那输出数据呢,就是value。Value把它取出来。还加倍得到一个Y对吧,然后呢,Out点。
08:03
正常输出,诶把这个value输出同时清空状态啊,Value this点可以。那到这个为止呢,我们就搞定了。对吧,这块特别这块,最后这块肯定没有什么问题啊,你最后输出数据吧,电视器响了,你输出数据对吧,然后呢,呃颗粒啊清掉那这块大家有没有疑问,对于这个。没有疑问的话就扣个一好吧。能明白吗?这个应该没问题吧,对吧?好,这个是我们关于这个left join这个数据的一个驱虫啊。
09:09
判断是否等于一没看懂?这个没懂吗?那那你看啊。嗯,首先我问大家这个大明龙你回答啊。如果说第一个大,它返回几啊。返回一是不是就是这个要大啊,前面的大返回一啊,它俩相等是返回零对吧,后面的大返回负一吧,这个没问题吧,好,那我们想啊。我们要保留时间更大的,对不对?我们的状态里边是不是保留时间桌更大的数据啊?对吧,好,呃,那如果说你是一。保留谁?保留他自己吧。是不是保留第一条,那还用还用动吗?那你状态里边本来就是差呀。
10:03
你装在里面是不是,如果你等于一,你是不是装在里面本来就是它呀。你状态需要改吗?不需要吧,你哎,那那我问你啊,你你这个地方有必要这样写吗?说value state.update啊,就是我我感觉呢。啊,是对郭际类的返回置记反了对吧,所以我刚才不是带着你看了一下这个吗?我告诉你,那你看042041前面的大,前面大以后呢,返回一啊,我刚才带着看了,我我知道可能有同学没记住对吧,没太记住,所以我刚才在写这个东西的时候,我带你看了一下嘛,这是042,这是041,我还特意强调了,我说这个前面大返回是几啊,返回这一。我还带你看了这个,没注意啊,可能当时走神了,行,那就搞明白就行了,其他同学还有什么不明白的吗?赶紧问啊,你不说,那我只能认为你明白了,对吧,因为除了扣一的。
11:00
其他人不说。你不说,我就只能当你明白了,因为我要当你不明白,我就疯了,我,我哪知道你不明白什么呢?对吧,好啊。好,那到这个为止呢,我们就得到了一个。过滤后的数据对吧,去重后的数据我们叫filter。对吧,接下来提取事件时间。点。A za他们step and whatmarks啊,那还是一样的,我们给他一个两秒的。延迟还是跟一样嘛,我们都保持一致对吧,这边呢是杰森。发布价好。呃,咱们呢是element对吧,这个数据呢,我们来找一下它的数据时间啊呃,在这边来看啊,呃,当然呢,我们就不要用它了,这个不属于这个什么事件事件,这不是事件产生的,这是我们后来处理的时候给的时间。
12:05
对吧,这后来处理给的时间啊,那我们要的时间,时间是谁呢?其实就是他这个call back time。啊,就是这个call back ten这个参数OK吧,就用的是它啊,啊按正常来说呢,咱们支付成功了,这个数据呢,肯定是有的啊支付成功了,因为在下面我们支付成功的数据过滤出来的是这个配state更新以后1602的这种数据啊,它一定有一个扣back time就是它啊这就它OK了,好,那接下来呢,我们就element点。Get。啊,这个支付成功了,对吧,因为这张表呢,刚开始是1601 1601呢,是你申请的支付。你支付到支付成功,它就返回了,就变成了1602,同时它这个bag时间也会补充上它这样的一个逻辑啊好,那这样的话呢,我们就得到了一个call back time。
13:01
对吧,最后呢,返回数据,那就date for you点。从。TS对吧,转化为毫秒啊呃,那call back time加上一个。处啊,加上一个处这块呢,我们需要去看一下对吧,因为这个时间啊,只要加了什么time对吧,不是什么DT,那么它就是什么呢。它就是年月日十分秒啊,那这个呢,没关系,我们来看一眼吧,对吧。找到我们的支付成功的。支付。啊好,那这里边呢,就是它啊。Call back time对吧?年月日十分秒看见没对吧?所以呢,咱们在处理这个数据的时候,加一个处它是全的啊,把它变成一个毫秒啊,那这样的话呢,咱们就得到了这个数据的,得到一个with mark对吧,杰森。
14:08
Project with world哎,那word提取了提标以后呢,接下来按照uzd分组这一步呢,就直接替代对吧,接省呃,按照UID那一样的,我们来找一下这个UID,它在这张表里叫什么对吧?还是找最后啊UID这个叫UID吧,啊那就简单了对吧,拿过来啊。杰森点。GA strip。对吧,好,CTRL加V得到一个。Kid。By u ID DS对吧,这是我们的一个建构流啊,K的DS,但是呢,呃,我们是UID跟上面呢做一个区分对吧?好好,那这样的话,我们这个得到了,得到之后呢,我们可以处理这个独立支付成功数啊,这个呢就状态变程对吧?好,那直接用这个Fla map啊,你有一个。
15:03
Reach状态编程吧,Rich对吧?好,返回数据,那肯定是我们刚才写的这个账号定的。对吧,好,刚才我们的招聘叫我看一下啊,这边这边比较多了,我们打开的东西比较多,我关一下啊。什么订单明细啊,比较类。就是他吧,对吧,就是这个啊。嗯,叫pay payment window b啊就是它对吧。好,那按照刚才我们的逻辑,首先呢,第一步我们要搞一个状态,对吧,Value state啊存这个日期的类型对吧,这个叫last。DP。Open方法啊,当然这个呢,由于我们要保留这个从早到现在的,从最开始到现在的一个整个的增长的用户数。对吧,首次就是新增的付费用户数,所以呢,这个状态呢,不能清啊,不能清的话呢,我们就直接。
16:06
也不写那个什么TL。点有一个value states,好,然后这边呢是叫。Last。DT。上一次的DT对吧,资源类型点。好搞定,搞定好以后呢,接下来我们到这边来,那首先第一步取出当前的。时间。以及状态当中的数据对吧,好取出状态中以及当前数据的日期对吧?好状态的日期呢,写lastt点。Me?啊,那这个呢,我们就得到了一个。DT,对吧,将来当前的,呃,当前的这个日期呢,我们就还是用call back time来做处理,对吧,那就value。
17:04
点。Get STEM啊叫什么呢?叫call back time对吧,这个啊。它呢是年月日十分秒,所以呢,我们空格切割取第零位。加倍得到一个什么?得到一个这个数据对吧,这是CURRENT1题。当前的这个时间对吧,好,那我们判断。第一步判断。状态日期。是否为那?对吧,在这之前呢,我们定义两个定义。当日。这个支付。独立用户数对吧,以及。新增。总的来说,新增付费。人数啊,用户数也是人数啊,对吧,两个啊和一个呢叫配。
18:09
配这个。就叫他吧,我简单一点。呃,还有一个呢,我们叫妞。Pace。对吧,或者说这个也没有什么S啊,一条数据它不可能有多个啊。没呀,我就不取那么复杂的,当然,呃,你要是为了好看一点的,我拿这个吧。总结了吧,对吧,好,我我其实不想写那么多。支付成功的新增的一个用户数对吧?好,那这是两个啊好,那首先判断日期是否为呢?那give这个叫last dt它呢,等等于,那那这两个都改为什么。改为一对吧,这两个值呢,都要改为一啊。都要改为E,好,那否则else if对吧,Else if,哎,你不等于呢,但是呢,Last dt.equals谁呀,Ity,如果呢,你俩。
19:09
不等。对吧,你俩不等,那不等的话,是不是只有它改为一啊。独立用户数改为一对吧,啊后面的呢,不改这个不改,因为你呢已经不等于那了,说明以前支付过你就不能算作新增了,但是在这两种情况下来说呢,我们状态是不是都要更新一下对吧,更新一下呃,那就是。Last。Dt update。呃,用当前的日期对吧,这一步呢,也。要做一下更新这个。状态对吧,更新这个状态OK吧,好,当然有的人说,那我你这两个分支里边都写,我直接拎出去拎在后面,拎到前面可不可以。其实也可以。其实也可以对吧,啊,那为什么呢,因为。
20:03
还有一个分支是什么?是它俩相等。是不是还有一个分值相等啊,那既然你俩相等,我更新一下,我更新跟没更新是不是一样啊。对吧,所以呢,你直接把这个更新拎出去,其实也可以啊,其实也可以懂吧,对吧?啊,因为咱们虽然没有有一个分支没写嘛,还有一个分支是不是零零的分支啊,零零分支状态是可以不变的,但是我状态再更新一下也无所谓,因为你俩相等嘛。能明白吧,啊,那我们呢就不行啊,少做点事嘛,相当于啊好,那接下来呢,在这边。返回出去准备出结果了,对吧,出结果呢,你再判断一下if这个东西呢。他要。等等于一啊,它要等等于一,我们再说对吧,这个要等等于,那另外一个我们就不用判断了,对吧,再判断呢,啊或者说你或者。
21:00
你这个有意义吗?或者它等等于一,你看是不是还是跟我们之前出现一样的这个东西呢?横为false,横为false,为什么?因为我们用的是什么。或者那。这个呢?如果判断它等于零对吧,不等于一啊,它等于零,它等于零,到后面来了,你这个东西不用想一定等于零。对吧,只要能走到这,这一定等于零啊,就不可能唯一对吧,所以呢,这个判断是多余的啊,这个之前呢,我们之前也提到过,对吧,因为它不存在。零一的情况,它只有零零。1110,它就没有零一,所以呢,那个情况你不用考虑了啊,那如果说它等等于一,那我们呢,把这数据输出,那就out点。Connect。对吧,又有一个叫trade。Payment window b对吧,第一个ST,第二个e dt啊,那么第三个。是我们的。
22:01
独立访客。第四个。是新增的。用户对吧,最后一个诶TS,那我们先给个档值,反正最后呢,我们会补对吧,这个呢给个档值,因为前面呢,我们没有TS嘛,对吧,没给没给的话我就不给了啊好,那这一步呢,就搞定了,CTRL加V啊得到一个trade。Payment。啊,就转成了我们要的这个。扎地。对吧,对,那我们要招聘啊好,那把这个呢,接下来呢,开窗聚合点。对吧,还是一样的to平time window.off这边呢,他们点second给一个十秒就行了,然后。返回值还是吹的PA面的window啊,还是它啊,这里边儿呢,我们就快速的去写一下。
23:04
返回VALUE1啊,然后呢,Value一点。呃。这个啊。这款你不要写错了,两个字段都挺长的,稍微注意一下啊。哎。好,Y一点。新增的啊。W2点干新增的这个用户,新的付费用户对吧,最终呢,返回万六一没有问题,那这边呢,还是三步呗。嗯,点。点。Said。TS。啊。next.set ET,然后呢,是date for my YouTube.to.get end。
24:10
对吧,Date for点,然后点。Get,最后呢,输出out.connect next输出出去对吧,这样的话我们就得到了这个result。DS好,最后呢把它写出啊。点这一步呢,就已经真的是,呃,写烂了,写烂了,已经到这块为止都真的不想写了。好,实在不想写了。现在大家什么感受啊,那天我问大家的时候,大家还觉得,诶这个东西好像还不是那么熟悉,那到今天呢。到今天对于这款代码感觉怎么样?是不是就没有什么难度了呀?对不对,完全没有什么难度了。没毛病吧,啊,还是比较简单啊好,那这个呢就搞定了啊,就差一点东西吧,诶我怎么把这个拿到这了,不对啊这。
25:09
表明in色into维斯,快五个吧。窗口两个两个指标一个TS嘛,五个啊,然后呢,表明我去拿一下啊在这。但是呢,这个表虽然我没有创建,但是表明可拿嘛,对吧。往这放啊,这个呢,是将数据输出到这个c house对吧,好好把这个,那咱们做一个测试,那测试之前呢,还是一样的,我们得先把这个。数据流和需要启动的程序得在这儿整理一下,对吧?呃,它呢来自于这个支付成功的数据,就这一个主题吧,所以呢,我们就拿它就行了啊。呃,直接。把这个拿过来,然后呢,加。一点东西就行了,对吧,加一个什么呢?来在这边加一个。
26:02
APP。对吧,然后呢,加。这个呢是咱们的DWS好,呃,那再往后呢,诶把这加上克house,这个是ZK,这个福林呢是他自己好,那我们看一下其他开什么东西啊。嗯,麦开的Mo肯的,最后开嘛,Mawell对吧,等会开一下啊,ZK卡夫卡要开,哎,这是ZK卡夫卡没有问题啊呃,ZK卡夫卡,ZK卡夫卡加这个ZK house对吧,所以呢,我们要开的就是Maxwell ZK卡夫卡和这个好那题型当中把它看一下啊。所以有这个内容呢,你就不容易丢了,要不然的话你就会很麻烦,你现在要做测试,你越往后越麻烦,因为你的流越来越多。对吧。好,那第一个ZK。
27:00
嗯,卡不卡。Maxwell。对吧。嗯,还有一个这个。好,那进来。咱们,哎把这个打开右咱们的库啊,第帽下划线211126。好,那这个呢就搞定了,接下来我们看一下其他程序有没有挂掉啊,啊同时呢,我们还要得去造Mo数据对吧,所以这边呢,还得要有一个窗口啊。哎,其他程序呢,并没有挂掉啊,这边呢,我们的c do do到这个。DB,哎,最后呢去造数据对吧,好,那这边呢是我们的house,接下来呢,把这个表建一下。
28:00
还是一样的五个字段,按TS作为我们的版本,然后呢按天分区啊,之后呢,这个驱虫按照这个窗口去重就行了。因为它没有这个分组没有力度嘛,对吧,所以就是按这个窗口时间啊,那我们这边就搞定了啊的。行。From,从这张表里边呢,去查这个数据啊好,这是最后呢,我们查结果要用到的内容,对吧。还有的内容,呃,那下来我们要启动东西啊,第一个这个预处理的这张表对吧。DWD层预处理表,你看这三张呢,你都一看就看出来,因为我们改东西了对吧,所以它是蓝色的啊,还没有转到D的,好,这是预处理表。加了一个字段啊,等会来看他报不报错应该没问题啊,因为我都注意了这个逗号啊,东西都加了啊。如果说有一个类一启动报错,那我们就检查这个字段,因为之前我们都测过的,对吧,今天就动了这个字段啊,这A啊,然后呢,All the detail把它打开。
29:07
订单明细,这是下单数据对吧,这是下单数据啊。呃,然后接下来呢,是支付明细啊,支付明细。支付成功啊,这是支付成功的一个明细。好,那这三个呢,看上去由于我们加了一个字段,好像也没有问题,四个上好像能过,语法上没有问题对吧,说明我逗号呢,这些东西都补上了,没有问题啊。那接下来呢,就是他自己了呗。啊,但是这个东西我们没有测过啊,我们得开起来看它有没有问题啊。当然这个像流这个有没有问题呢?更多的可能我们还需要这个。造数据才能看得出来。对吧。好,那这样看一下有没有丢动呀,呃,预处理的没有问题,All the detail没有问题,然后呢,支付成功的没有问题,然后呢,就是他自己对吧?哎,那我们的数据呢,都已经打开了啊,打开好以后呢,我们就造数据就好了啊在这边。
30:02
啊,当然你这个东西其实可以写在一个脚本里面,不用每次都这样对吧。但是这个还好,也就是他自己嘛,对吧,就这一个程序造还好。好,这边呢,做完了,做完之后呢,我们得到这边来看一下,当然这个第一次造啊,它不一定有数据啊,因为前面呢,我们都用了flink circle,我没有写打印。啊,没有写打印,所以呢,这个数据没有对吧,你也看不到,那这个为什么没有数据呢。对吧,这条这写着打印啊,因为我们开了一个十秒的窗口,大家还记得吗。对吧,所以呢,我们要等一个十秒啊,等一个十秒过去,然后呢,再造第二次数据来触发第一个窗口的关闭,对吧?好,那这时候造呢,肯定没有问题了,对吧,再造一次啊。就是两次造呢,你不要造完立马又造一次,对吧,你最好呢,等一会儿,哎,间隔十秒以上啊,你再来看这个数据。
31:04
这个是原始的,还没有。这边有了吧,啊呃,八十八十没有问题啊,因为他是第一天嘛,所以他俩肯定都是一样的。对吧。这个时候他俩是不是一定都是一样啊。今天呢,是不是就等于等于总的新增的没有问题吧,对吧,那如果说呢,你想看到这个东西两个值不一样对吧,那怎么办呢?得。改一天啊,只要你是在今天造啊,那我们来出发第二次造数据,那这是用第三次来关闭第二次的一个窗口,对吧,那他俩数据呢,肯定还是一样的。来看一下,等着啊。91 91没有问题吧,他俩呢,肯定还是一样的,不用想。啊,你再造一次,哎,用这个第四次来触发,刚才造这一次的。
32:01
第三次的一个结果,他这样还是一样的,对吧,好,那我们再验证一下啊,再造一次对吧。这个应该过十秒了吧啊。十秒钟其实还是蛮快的啊,但是你要盯着秒表去数。他可能还是蛮慢的,对吧。好,这个做完了,我们等一下看有没有应该过了十秒,我觉得。哎,那八十五八十五没有问题吧,这样肯定是一样的,如果我们希望这俩不一样,那我们这怎么办呢?来家看啊v application depoit,然后把这个呢改成5月25号,哎,我隔一天了,对吧,跨天了,好,那我们呢在。造一次。啊,再造一次对吧,啊,当然这一次造出来呢,他应该还是一样的,因为这个5月25号的数据呢,它还会触发一次5月24号最后一个窗口。就是我们第四次造的数据,对吧,因为这个呢,已经是我们第五次造数据了,他应该出来的还是5月24号的这个数据看。
33:03
5月24号的数据对吧,这个呢还是一样的,好,那我们再等上十秒,再造一次5月25号对吧?呃,那这次呢,就有可能不一样了。啊,因为我们造的数据八十九十七十对吧,那有可能有重复的数据吧,跟那个5月24号有可能有重复的数据啊,只要有重复的数据,那么他俩就不一样,对吧,当然我们那个。来看一下啊。走,现在呢,已经造了这个过了十秒了,那我们来看这个数据是否相等,因为只要你这个时间不改,它俩一定都是一样的。对吧,因为第一天啊,第一天呢,你当天的那就是对于整体来说就是新增的对吧。好,你看。当天的72,但是总的新增的呢69,诶说明里边有三个。重复项。对吧,说明里边有三个是重复的,就是重,所谓重复是什么呢?跟昨天重复了对吧,所以它只属于今天。
34:07
但不属于整体上新增的,没问题吧,啊,就是你把时间一改,你就能看到这两个不一样了,只要你不改时间啊,他俩一定是一样的,对于第一天数据而言,他俩一定是一样的,这个没毛病吧,应该能理解哈,对吧?好,那这块呢,咱们就说完了,哎,最后呢,差一步啊,看这个克号有没有写来。哎,就是我们刚才五条数据吧,那这边呢,打印了五条数据啊。啊,这前面是四条嘛,这是四条,最后呢,空格很难很多啊,然后呢,这边有一条对吧,五条数据没有问题吧,这是五条OK吧,这就搞定了啊。
我来说两句