00:00
好,嗯,接下来我们看第七个需求是这个交易支付各窗口的汇总表,哎,他做一个支付。对吧?呃,那关于这个需求呢,我们要做什么,现在还没有到求金额,我们先搞定这个人数啊,后面呢,我们会有这个金额对吧?呃,比如说这个各种力度下的金额啊,到时候会有啊呃,包括支付的话,只不过说后面没写,就是下单跟这个退单对吧?这些东西啊好,那我们来先来看这个支付,我们要求什么东西呢?求这个。支付成功的独立用户数。以及首次支付成功的用户数。对吧,就是说新增了多少付费用户。啊,以前呢,可能这个用户有很多的数据,但是呢,从来没在这个平台花过钱,反正对吧,那我们呢,就要看一看。
01:00
呃,有多少人又心在今天,又有多少人花了钱了?对吧,啊,那这种需求怎么求呢?首先是他啊他呢还是比较简单的,每天的独立用户数。对吧,还是一样的,按照用户ID呢分组,接下来呢,搞一个这个状态,这个状态呢就保留。最后一天的那个日期,对吧,上一次上一次。购买的就是支付成功的这个日期,然后呢,比较如果状态等等,应当或者状态日期与当前日期。不同,那么我就是记做今天的一个独立户对吧,那如果相同,那不好意思。如果你不等于呢,并且呢相同,那这个数据肯定就不需要,因为你今天已经付过了。对吧,那如果只求他,我们还可以设置一个TTL一天啊,还是这个道理对吧,还是这些的,那首次由于我们又加了一个什么首次支付成功的用户数,哎,那如果我们考虑这个事情,他呢,必须要求这个状态为now,大家想是不是。
02:12
就是你呢,状态为none的时候。对吧,状态我们想啊为那那这个是一,这个是一,那我用这一对吧,好,那如果你状态不等于钠。那这个一定是零。对吧?啊,这个一定是零,那这个是不是一呢?不知道,我们还得去判断判断你状态的日期跟我当前日期是否相等。如果相等,那也是零。对吧,如果不等,那它就是一,它是零。它是一零对吧,也就是说它有这种情况,那这个呢是不需要的,我们最后呢,可以做一个过滤,对吧,那有没有零一的可能性啊。这种可能性是不存在的,对吧,哎,它属于今天的,呃,它它不属于今天的。支付成功独立用户,但属于整个首次,那怎么可能?
03:01
对吧,整个的都是首次呢,那对于今天来说,那必然是属于今天的一个独立用户数啊,没毛病吧,所以零一这种不行不存在,那最后输出的时候呢,我只要这个不等于零是不是就够了,对吧?那这个还是一样的,跟我们前面所做的需求呢都一样,这个能明白吗?我就不用多说了啊。这块就是核心的,我们再提取这个独立用户数,以及支付成功,首次支付成功用户数这块没有问题吧。我们用一个状态,这个状态呢,不能设置TTL。这个有没有问题,就最核心的这块,求这个人数的这块。我觉得应该没有问题,我们已经写过太多太多次了。对吧,我们已经写过。太多次了。
04:00
啊,我们已经写过太多次了。好,那。关键还有一个什么样的问题呢?是这样子的,来啊。我们呢,前面这个数据。哎,那大家还记得这个交易支付成功主题的数据怎么来的?来我们看一下啊。呃,交易成功支付的数据啊。在DWD层吧,DWD层啊呃,支付成功的叫这个配。这是detail success对吧,就是他啊交易成功的。好,呃,那这个数据是怎么来的呢?来我们来看啊。首先。过滤出支付成功数据,这个没有问题。对吧,啊,然后呢。消费下单主题的数据,诶,那我们只要下单主题的数据,从这个我们之前写的下单主题里边去拿到这个数据。
05:09
对吧,啊,然后呢,三再搞一个维表啊,被DC这张表之后呢,把三张表给他。关联起来。啊,把三张表关联起来对吧,好,那就涉及到。这个数据呢,倒还好。更新且呢1602就是一条对吧?啊,每条数据呢,只会变成一次啊,那关键的问题在于什么呢?在于这个下单来我们看啊,它是来自于这个all detail对吧,下单还不是易处理表啊,我们找到这个order。呃,这是这单奥跳吧,这个是预处理表,我们不用预处理表,我们用的下单表这张表对吧?这张表怎么来的呢?这张表读取的是预处理表。然后呢,过滤出新增数据吧。对吧,我们过滤出新增数据,好,那我们来思考一个问题。
06:04
呃,我们当前这个支付成功的数据啊。我们当前这个支付成功的数据,它是怎么来的,它首先呢,消费的是topic DB。对吧,他消费了topic DB这里边,然后呢,取支付人工数据对吧,这个呢倒正常。然后呢,我们去join拿着它呢,去join什么下单数据。而这下单数据怎么来的,是从预处理表当中。是从预处理表当中过滤出音色的数据吧?对吧,刚刚看了好,那我问下处理表怎么来的,预处理表是不是无表关联?订单就all in for all the detail,然后呢,All the detail activity all the detail cover,以及被DIC5表关联的特别的在里边呢,有一个left join。对吧,好,那就算我们的下单数据,那我们对于同一个订单明细而言。
07:07
对吧,因为我们拿着订单明细与订单表进行关联。啊,然后呢,再跟这个订单明细,订单明细activity进行关联,对吧?好呃,那尽管我们用了in色的数据,那他有没有可能。重复呢,因为我们用的是draw啊。对吧?我一个订单明细all the detail ID有没有可能重复?如果说你只有all in for与all the detail进行关联?那么它呢,是不可能重复的,但是由于我们又跟了这个left draw对吧。You like状语谁了?活动与购物券,那在我们下单表里边儿,我们的。订单明细ID有没有可能重复啊?那是有可能的吧,对吧,它会有多条,因为你用的left join它会撤回嘛,啊它会撤回对吧,这是我们所以前面用的up色的卡夫卡啊,然后呢,设置了一个主键对吧,但是撤回的这个数据呢,它这个nu值,那这个呢,你在如果说你在这个data stream里边,我们已经写了过滤了S里边你不用管三个里边呢,它取不到数据对吧,它这个是那的话,它取不到数据,它也自动就过滤掉了啊好那。
08:25
关键我们想要说什么呢?就是你看啊,你下单数据。他有重复。啊,你下单数据它是有重复的。那我们支付。与下单进行关联的这种数据呢。对吧。在这儿支付成功的,对吧,我们拿着支付与下单进行关联的这种数据呢。好,我们拿着下单。
09:00
一些关联的数据呢。他是不是也会有这个。重复啊对吧,比如说啊,那你是这样子的。啊呃,订单ID呢,是1001。它对应的呀,有两个明细1001。A1001B注意这个是all ID,这个是all the detail ID。对吧,All all detail好,那么接下来呢,呃,这条数据,比如说他有这个活动,他参与了活动,他呢。领券了。可以吧,哎,一个。有活动一个呢,领券了,因为这个活动也好,还有领券也好,它针对于具体商品而言的。对吧,具体商品而言的好,那这个呢,就关联到我们的订单明细了。对吧,嗯,那有没有可能出来啊,它是这样的数据,那因为你要来join它嘛,对吧,这个呢,要来join它,本来你俩就两条,现在呢,有没有可能是这样子,哎,那1001A先呢,有一个那。
10:12
对吧,那购物券呢,也是那没问题对吧,好,那又突然来了一个1001。A,活动呢有一个数据,但是这个呢还是呢。对吧,这样是呢,好又来了一个1001。B,哎,他俩呢都是钠对吧?啊都是,那后来呢,又由于level join又来了一个101 B,哎,这个活动为那但是购物券呢,有数据对吧?哎,有这么四条数据啊,那他们的订单l all的ID还都是谁啊,1001。对吧,接下来呢,我要拿着支付成功的数据跟他进行什么关联啊,那你这四条订单ID都是1001,那我一条支付成功数据是不是关联到了四条。
11:01
对吧,那这里边儿我们要做什么事呢?我们是不是要根据这个订单明细ID做一个什么。驱虫。就正常而言,我们想一下是不是要做去种,也就最后我们保留谁啊,保留这个支付数据对吧,支付有支付啊,有这个1001订单ID,然后呢,1001。A,然后呢,诶他有数据,他没有数据,同时还有一条,我要保留幺支付数据10011001订单明细B对吧?然后呢,呃,活动没有勾物券有,也就是说把这个数据最早的这个数据给他干什么,给他干掉,能理解吗?这块。就是你能想到这里边由于上游带来了重复数据,到了下游我们最好要做一次什么,要做一次去虫。能明白吗?
12:07
其他同学呢?能不能明白我在说什么?因为上游我们用的let draw,它是有可能对于一个订单明细而言,它会出现这两条数据啊。为什么要把nu的数据去掉?不是说要把none的数据去掉。不是说要把none的数据去掉,而是说那假如说你这个数据啊,比如说吧,还有一个1001C,他呢,没有东西,没有参加活动,也没有参参与这个购物券,那么10011001C,那后面两个都是呢,那这个数据要保留啊。不是要去掉none的数据啊,不是要去掉none的数据,而是说由于你level draw,你想想看draw。他是不是先写一条,然后呢,你后续右边数据来了,他是把老的数据撤回,又写了一条,这两条数据呢,他说互为重复数据,那第一条是不是都是呢。
13:08
这个地方的逻辑,我们并不是要去掉none的数据啊,我们要把后面的数据保留,而把前面的数据删掉,能明白吗?对吧,不是说要把那的数据去掉。其他同学呢,能明白,因为我们前面用了left drawing。对吧。所以呢,他会先写一条。对吧,是这个意思啊,所以呢,一般来说在这个地方呢,我们得考虑到要做一个驱虫啊呃,但实际上呢,你未来的工作的时候啊。你可以具体问题具体分析。对吧,具体问题具体分析,那其实我可以告诉大家,对于当前我们这个数据而言,就我们这个需求而言,对吧,我们求的是一个什么呢?我们求的是诶独立用户数,以及首次支付成功用户数,对吧?我要的是一个用户数,就是说你要不然就是一,要不然是零,只有这种指标,我并不需要把某些字段,假如说我要求。
14:21
支付的总金额,那你一定要去投。对吧,而我们对于这个求这个用户数啊,独立用户数,或者说呢,首次支付成功的用户数而言,那大家想一个问题,我不做驱虫,可不可以我直接。用状态编程去判断,那你不是重复入队吗?我本来要对这个用户ID要做什么?我本来就是要做驱虫的。最终。我就是要做驱虫的。对吧,所以如果说具体到这个需求,我能不能不做驱动。
15:04
能不能?就是刚才我们说由于。产生的这个数据,我不做这个驱虫可不可以?这个要跟大家聊清楚啊。撤回了卡夫卡不是。那么这种还是要去重。你还是没有理解啊,你还是没有理解,呃,我我这样把数据给你写出来,比如说我有一个凹的idea。1001。对吧,好呃,那它对应的呢,有两个订单明细可以吧,订单是1001啊这个是凹的ID,我写一下啊。就是你还是忘了那个数据到底是长什么样子,对吧?好,那接下来呢,我们有两个明细啊,All the detail。
16:00
对吧,是A和B。啊,A和B啊,或者说呢,我们就举一个例子吧,就一个A其实就够了,对吧,一个A好,那么这个注意啊,他们订单ID肯定相等的,我就不写了,对吧,都是1001啊,然后接下来呢,还有一个什么呢?呃,这个o order。Detail。Activity吧。我就拿这个给你举例子,好吧,拿这个给你举例子啊,现在呢,有一个参加活动啊,这个比如说是1001可以吧,好参加了一个活动,活动呢是A1啊,参加了一个活动A1。那我们是怎么join的,我们之前是拿着all去啊,或者说呢,我们这样写写清楚啊,我们之前写的应该是all detail去join这个order对吧,然后。在left join谁?Activity。我们之前的数据是不是这样写的预处理表?
17:03
没没毛病吧,我们的预处理表是不是它。预处理表是他吧?这个有没有问题?就是你们学了后面就忘了,前面啊强调的东西都忘了,这块也没问题。对吧,好,那他转的结果可能是什么呢?如果说这样的数据对吧,好,假如说他呢,稍微晚到了一点。稍微晚到了一点,求这个all the detail activity晚到了一点,但是呢,你由于是level draw,那有没有给他写两条数据,因为前面呢是正常join,它呢会写一个1001,然后呢1001下滑啊中杠板A对吧,中杠A啊再呢写一个那。对吧,好,呃,接下来呢,这个A1到了。他到了,他到了是不是要把这条数据撤回,撤回的时候像云总说的不错,你呢,在卡法当中写一个当值。
18:03
对吧,他会写一个捺值没有问题,但是它同时还会写一个什么。写个A1呀,我现在做的是什么呢?是他俩做驱动,这两个是不是相当于是同一条数据啊,而且第一条数据是数据不全啊。他不光有那啊,你撤回以后,你是把这个数据撤回了,撤回写那没有问题,但是呢,你又写了一个新的数据啊,你把这一条忘了云总。那那你写一个nu值就没了,那我写那干嘛呀,他更重要的是不是还写了第二条数据啊。那你想想看,那对于我同样的一个招引而言。那那是不是正常而言,我只要这一条呢。现在清楚了吗?他他确实像你说的,他会写一个浪值没有问题,但是呢,他在浪值之后,他撤回,他得写一条新的数据啊。对吧,就是当右边这个数据。撤回不是真的撤回原来的数据。
19:02
原来数据还存在,那肯定啊,他他这个撤回写了一个none啊,那卡法当中他怎么把这条数据删掉啊。这个写到是卡夫卡阿的卡夫卡他怎么把这个数据怎么可能会删掉呢。对吧。那不可能啊,他是把撤回这个数据变成了none,它都变成了none了,他怎么可能把这条数据能撤回掉的,它是两条这样的数据啊。他两条这样的数据,这个当时不都给大家测了吗。整个都测了,你你把这个数据都消费到了。对吧,当时都消费到了最后呢,把这个浪也消费掉了,然后就把这个消费到了啊,那怎么可能这条数给还撤回他卡发卡里边不光把卡布卡数据删掉,还把你消费掉的数据能删掉吗?那怎么可能呢?对吧?啊,你之前的理解就有问题啊,你之前的理解那我测不白测了吗?那个东西阿色的卡夫卡。我还专门写的例子,我还没有用。项目当中的这个例子呢,我还专门写的对吧,用那个8888跟9999端口去做的测试啊,你呢先来数据再来数据,它有三条数据啊,这个nu值,我刚才提到了data里边我们处理的nu值。
20:15
对吧,我们已经处理过,那值了啊,对于data stream里边我们已经处理过nu值了。关键在于对于。这个。弗林S格里边我们不需要处理,因为它那值的话,我们提取数据提取不到,提取不到数据它自动就过滤掉了啊,它会自动过滤这个nu值的,所以我们就不用管了。对吧,啊,那对于这个数据呢,我们可能考虑就要只要你上游用到了这种left drawing啊,或者什么事,对吧,那你要考虑这种驱虫。啊,前面数据呢,都没有这种情况,前面的需求从这个需求开始,诶有这个对吧?好最后呢,我们又提了一个点,假如说按照当前的逻辑而言啊来看,我们要求呢,是每日支付成功独立用户数。
21:03
以及首次支付成功用户数。我要一个用户数。那这个数据呢,本身我就是要按照user ID做去重。对吧,比如说这里边呢,有一个user ID啊,啊用户。是这个。这个数据啊好,那这里面呢。有一个用户啊,是这个数据。啊呃,那既然咱们所求的是这个。用户。啊,咱们所求的用户数的话,那你说这两条数据我非得提前做去重吗。或者换句话说,我不做提前,我先把这两条数据做一个去重。我不做这个事儿,能不能行?我不做,我直接去求这个用户数可不可以。
22:05
行不行?是。可以的。对吧,是可以的。啊,因为你这个人可能还有其他订单啊,还有这个比如说啊,这个人呢,还有一个订单。是什么呢?是1002啊,或者1005号订单吧,对吧,1005诶他参加了活动呢,A2啊,那有没有可能他这样的数据啊。这个是。五对吧,五。五诶,他参加的活动呢,是A2。啊,那最终呢,你。你如果说刚才我们所提到驱重是什么,他俩互为去重,对吧,他俩呢要去重,因为要找订单明细ID相同的这个数据做去重。对吧,那最后呢,你把这个结果取到,哎,也就这一条,最终呢,我们取到的是谁呢。我们取到的这一条以及这一条,他俩呢,在求这个用户数的时候,再放到一起,按照UID分组再做一次去重吧,但是呢,这种情况而言,如果说我们只是求这个用户数,对吧,求一个什么什么数,不不算那个什么金额总金额那。
23:16
我整体直接做驱虫可不可以啊?就是我把这四条数据,数据直接按照UID分组做整体的驱动,可不可以啊?对吧,这个就是具体需求具体分析了。对吧,那但是呢,你在生长环境当中,如果遇到了上游。有left join产生的这种情况。你要做什么事,你一定要注意一下。对吧,你一定要注意一下,可能这个需求呢,需要做驱虫。能明白吗?啊,如果说单聊我们当前这个需求的话。其实可以不做驱虫啊,可以不做驱虫。
24:00
能明白吗?OK吗?其他同学呢?啊,因为你要是不涉及到具体的字段,对吧,你本身要按照这个user ID做去重,本来就是要做去重的,对吧?啊,那你的订单明细ID相同的这一类数据呢,它的user ID。肯定是相同的,本来就会被去除掉啊,所以呢,这针对于这种特殊情况的需求,我们可以不做。驱虫啊,可以不做驱虫,OK吧,好,这是我们整体的一个需求分析啊,但是这个驱虫呢,我们还得想想办法啊,还不是那么好搞呢,对吧。
我来说两句