00:00
呃,那么昨天呢,咱们其实呢,主要做的是我们这个首单分析这一块啊,首单分析对吧?呃,那么首单分析啊,大家注意,那么首先咱们得确定一下大概时间思路什么样对吧?就是我现在可以从我们这个数据库订单表里边来远远的获取这个数据啊,获取订单数据啊,或者其他表的一些新能变化数据,对吧?那么你要做首单分析的话,注意你并不是单单的把首单数据给过滤出来,然后做分析了,对吧?其实你把所有订单数据都拿过来了,咱们只不过呢,在他的身上加了一个标记对吧?如果是首单,哎,那就标记为一,如果不是首单的话,标记为零,对吧?那么整个咱们现在要想实现我们这首单分析对吧?按照不同的维度对吧,比如说年龄段呢,比如性别呀,对吧,比如说咱现在省份呢,来进行统计的话,对吧,那么这个时候呢,咱们大概的一个对吧,这个流程什么样的,首先呢,最初的时候。
01:00
这个数据呢,他肯定会到到我们这个业务数据库里边去,对吧,下单了啊,比如说我现在提交订单,那么这个时候呢,他肯定会把咱们的数据啊保存到我的业务数据库里边来进行存储,对吧?但是我现在呢,要想对它做一个实时分析对吧?那么咱们肯定的得有一些软件啊,实时的把我数据库的数据呢,给同步到我们这卡卡里边来啊,给同步到卡卡里来,对吧?那么咱们现在的这两个软件,一个是我的kind,一个是mawell,那我们现在呢,用的是我们这个ma。啊,用的well,然后接下来,那么咱们现在把这个数据同步到我们这卡卡里边来之后呢,那么第一步啊,咱们是把所有的表的变化,对吧,咱们呢,都给它放到一个手机里边去了,对吧?这个东西咱们这个改变不了,为什么呢?因为我们这个配置呢,是在我们这个ma或者开头里边它来指定的,对吧?你现在从哪来拿数据,然后你要把这数据放到我哪个主题里边,对吧?这个应该指定好的,对吧?但是这个主题呢,这个数据太多太乱了,对吧?就是把所有的这个数据库的表的变化,它都放在这里边了,对吧?那所以说呢,咱们第一步是不是对它做了一个我们的分流处理啊,对吧,相当于也是做了一个分层,那目前呢,咱们现在这个层,什么ods层,这个ods层数据是怎么来的呢?它肯定是从,哎我们现在原始数据拿过来,那其实我们对原始数据呢,没有做什么太多的过滤,对吧,咱们只是呢,来把它根据我们当前它的一个我们这个表明对吧,然后呢,把原始数据呢放到。
02:32
不同的对应的主题中对吧,然后咱们在前面加了一个ODS后面呢,是我的表名对吧,这是我现在啊,第一个我们现在SPA推程序对吧,它完整的事儿。啊,把咱们现在数据给读过来,读完之后呢,做了一个分流处理,这个呢是我的ods层对吧?然后接下来那我现在呢,这个不同的表的变化数据啊,那已经到不同的主题列去了,那你要想完成我们的订单对吧,它的一个统计的话,那么这个时候呢,咱们要从我订单它的一个主题中来把数据啊给读过来啊来把数据读过来,那么如果说我现在要从我们的订单里边对吧,这个主题读数据的话,那么你还得去写一个SPA streaming,对吧,来处理我们现在这个程序对吧?大对整个咱们在流程在执行的时候,这两个东西是不是它这一条线都要执行过来的,对吧?所以说咱们现在正常情况下,这两个业务,这两个应用是在同时运行啊对吧?然后呢,我这个,而且还有这什么,我这业务数据呢,不停的往这个MY里边写,对吧,然后呢,咱们ma它也应该也启动了,它监控的变化,监控变化呢来同步到卡普卡里边来,然后它呢来进行分流,然后分到我们的不同的O点里去,然后我这块呢,从。
03:43
从我们现在它的一个o.S层里边来读数据,那我现在读谁呢?我主要是从咱们订单里边来读啊,我现在主要是从咱们订单的主题面来读,对吧?那么读完之后呢,大家注意,首先第一件事对吧,那么我现在想一想咱们这个昨天的代码,首先第一件事,咱们在读的时候,我其实只是呢,把它的时间做了一个变化,对吧?我本身我在卡卡里面存的呢,是关于我订单的一个阶S格式字串,然后呢,咱们给他做了一个转换啊,给做了一个转换,那么咱转换成什么了,咱们转换成我们这个Jason啊,转换成我们这个样的对象了啊封装order in form这个样的对象。
04:24
那么样利率对象本身呢,它里面有一个创建时间,有操作时间,但是并没有创建日期,两个小时创建的,对吧,所以说呢,那我对它的一个创建日期和小时对吧,做了一个处理对吧?这是咱们第一步啊做的事儿啊,这第一步做的事儿,那么第一步做完之后呢,那么再往下对吧,那么咱干什么呢?说我现在啊,把所有的数据,所有订单都拿过来了,但是那么哪些订单是我这个首次下单,哪些不是呢?对吧?那么这个时候呢,那我需要呢,判断咱们的用户是否为首单,那么如果想判断是否为首单的话,那么这个时候呢,咱们得想那用户是否为首单,那么咱们呢,需要去保留一下他曾经啊,是否在我这个网站上进行个消费啊,你需要把这个消费的状态呢,给保留一下,对吧,你消把消费状态给保留一下,那么这个消费状态保留在哪呢?对吧,那么咱们现在保留在我们这个。
05:20
关于数据库里边,这不太靠谱,因为你要经常去查的,关于数据库啊,效率比较低对吧?那如果要是保留在red里边的这个性能呢,是很高,但是这个东西呢,咱们状态和我们原来啊,它的一个每日它的一个登录情况,这个不一样,对吧?每日登录情况它的有效期是不是就一天呢?那么你放在内存里边,那没问题,但是我们现在是状态的,它是要常驻内存的啊,它要常驻内存,那么常驻内存的话,那么这个时候你的如果数据量比较大,这也不太合适了,用red对吧,那我现在呢,这个用red不太合适,那么大家想一想,我要取这状态,那肯定呢,也是根据的K对吧,然后来获取对吧,所以说呢,那应该是KV结构,然后常驻内存对吧,这个不合适,对吧,那你说存储能力还得强一点,对吧,然后查询效率呢,还要高一点,那么这个时候咱们是不是想到了我们的h base呀,这时咱想到h base对吧?所以说我们在h base里面创建了一个user state。
06:20
这样的一个表,那么在咱们当前这个表里边维护了用户的ID,以及啊,这个用户是否消费过啊,它的一个状态,对吧?那我现在判断首单的时候怎么判断呢?我们给大家列出两种方式啊,给大列两种方式,那么第一个对吧?那么咱们呢,从我们当前的一个离散化流中啊,就当前这个流里边来取出一条数据,然后根据这条数据呢,可以把这个订单的信息拿到,对吧?那么这个订单是哪个用户下的,这个用户的ID呢?我也可以把它拿到对吧?咱们可以根据用户的ID,然后到这里来看一看是否能够查到数据,如果能查到数据的话,说明啊,这个用户曾经下过单,那么咱们就标记他不是首单,如果说查不到的话,那么这个用户呢,他曾经没下过单对吧,那么这个呢,就是首单对吧,这是关于我们现在啊,它的一个第一种实现。
07:13
啊,关于我们现在这个订单的它的一个使用手段的判断,它的第一种实现啊第一种实现,然后接下来呢,除了这种方式之外呢,那我们又对它做了一个优化对吧?那么这种优化是什么呢?说我们现在每一条记录都封装一条circle口,这个呀,不太合适,对,那怎么办呢?我们是以分区为单位来封装一次这个circle狗进行查询对吧?那么如果以分区为单位的话,其实呢,我们在查询的时候,这个U端ID啊,就不是印了对吧?变成什么了啊不不是等于了变成印了对吧?那么这块呢,那你需要去做一个我字符串拼接对吧,拼接成我现在的想要那种形式对吧?然后接下来那么再往下对吧,咱们呢,呃,也是根据他做判断啊,判断一下我们现在啊,这个已经对下过单的用户包不包含你当前这用户,如果包含的话,那么这个时候呢,对吧,咱们对吧去做一个,哎,我们这样的一个复制处理,对吧,这是第二个操作,那么你现在把这第二套做完之后呢,那么再往下的话。
08:14
那么咱们呢,得想办法干什么呢?我得去把这个东西啊保存一下。啊,我得把这个这个这个这个状态给保存起来,因为你不能光从base里边来拿呀,咱们现在如果说用户啊,第一次咱们访问网站,那第一次访问网站的话,第一次下单对吧,那么这个时候呢,它是首单对吧?那么如果把它标记首单的话,大家想想下次再来的话,是不是就不是首单了呀,所以说呢,那么咱们需要干什么呢?需要对他做一个标记啊,需要做一个标记,所以说咱们现在在我们这个最后啊,那我在提交之前啊干什么呢?我把咱们首单用户给拿过来,那有同学可能会想说,老师你为什么只拿首单用户,不是首单用户你就不管了吗?你不是首单用户就不需要把这个状态往那个HP的更新了吗?能想明白吗?同学们你想一想,不是首单用户你怎么判断的,你是不是从咱们h base里面把它查出来的说明,如果不是首单是不是HP里已经有那状态的,那你说他更新的干啥对吧?所以说咱们这里更新的是谁啊,更新的是呢,我们这个首单用户啊,更新咱首单用户对吧?那么这块儿呢,你注意一下,把首单用户给过滤出来,然后接下来咱们呢,要调用我们这个save to菲尼克斯的方法,注意啊,我向大家在写代码的时候呢,对,也像我这个写代码的时候一样,对吧?一开始我在没有导这个包的时候,我想用RT直接调这个方法是不是掉不了了,对吧,为什么?因为咱们现在这个东西,它的是有饮食转化在里边了,对吧,它是我们现在这个菲尼克斯对SPA的一个支持,所以说你需要把这个包给我导进来啊,那么导完之后呢,咱们可以调这个方法,这里边对吧?诶他需要什么东西,咱们给传什么东西就行了。
09:57
啊,他需要什么东西,咱们给传东西就行了,然后根据早晨大家的提问的,那么这里我觉得呀,有必要把这个关系给大家说明白一下,那么大家呢,前面学过谁,学过我们的H贝斯对吧?然后学过谁呢?学过我们这个菲尼克斯啊,学过咱们这个菲尼克斯,那么他俩的关系是什么,同学们。
10:20
它俩关系是什么?这个h base呢,是个这个N的这个真正执行或者存储对吧,或者这个什么这个存放数据的地方,这个菲利格斯呢,是不是它的一个外壳呀,对吧?就如果说我现在直接操作h base行不行,可以啊对吧,你们有不不也学咱们h base一些API了吗?咱们H不也有一些指令吗?对吧,但是呢,他在操作的时候这个东西啊比较麻烦,对吧?那么为了我现在呢,对吧,这个可以写类似我的circle这样的语句,那我在他H外边包了一个什呢,包了一个菲利克斯对吧?那么你现在客户端的,你再去操作的时候,你直接可以操作谁直接操作我那菲利克斯,别看你写的什么Korea瑞的table啊,什么sli的星啊,对吧,你这个sla星和谁和咱们S干的效果其实是一样的,同学们,你现在写的sla克星和咱们h base里边,它执行SKY这个效果呀,是一样的,只不过呢,那这两种语法让你选select的什么,SKY让你选,你是不是select更清。
11:20
这一点对吧,哎,所以说呢,其实就是相当于帮你做了一个我们的包装。啊,然后呢,咱们可以在这里边对通过我们这个思Q语句来对它进行一个操作,啊,来对进行操作好了,这关它们之间关系啊,啊然后接下来咱们把这个完事之后呢,那这里昨天呢,呃,我们还做了最后一个这个知识点,注意知识点什么呢?是不是这里有一个漏洞啊,就是漏洞的是什么?就是同一个批次里边,如果一个用户下了两次订单,那么这个时候呢,咱们需要呀,把这个状态给改一改,对吧?那么如果说我现在这会儿大家要是把思路给弄明白的话,其实呢,这个东西还是这代码还是不难的对吧?代码还是不难的对吧?那么你要想去完成这些功能,那么怎么办?对,大家想想,同一批次里边,如果用户下两次订单,那么咱们是不是得按照用户进分组对吧?那么如果按照用户进分组的话,我这种结构再做个转换对吧,转换成什么结构呢?转换成咱们的KV对吧,这样的一个结构,对,然后进来,那你要想分组短时格式BYK,那分组之后呢,它得的是我这个用户的ID,以及呢,我们现在它的一个当前用户他所下跌。
12:25
订单,那么咱们现在对当前用户做订单做个处理呗,怎么处理呢?判断一下订单数量,是不是我们大一,如果说大一的话,说明这个用户下的多个订单,如果没有大意的话,说明咱们用户就一个订单,就一个订单,你是不是不需要处理啊对吧?那么如果大意的话怎么办呢?咱们现在就是排序呗,对吧,因为我现在要把首单对吧给他对吧,至为我们这个正一对吧,然后接下第一次啊下单至一,其他至零,所以说呢,咱们呢,按照时间把吧最早下单呢对吧,这个给拿过来对吧,那所以说呢,按照顺序给拿到对吧,那么咱们翻去之后呢,把第一个我们现在呢最早的这个这个状态一保留,然后其他的对咱们呢,这个这一顶啊,其他的这于顶对吧?那么这块呢,是关于我们现在的它的一个的这个同批的状态的修正,呃,那么这个修正完之后呢,大家想一想,那么你再往下写的时候,那么这里呢,那你是不是得抽取变量对吧?来,然后让下面去使用它呀,所以说呢,那在这里我呢去把这变量抽取一下。
13:27
这个是VR对吧,那么这时候呢,Order in for with first flag对吧。然后接下来这个呢,是real啊好了,那咱现在呢,把这个这个变量抽取出来了,那么你下一次再提交的时候,你不应该用咱们原来这个,你是不是应该用修正之后的这个stream来做提交啊,对吧?哎,那么这块呢,要注意一下还有一个啊,那么这两天又有同学问我说老师,咱们现在呢,在这里在保存我们现在这个偏移量的时候,到底应该把它放在哪对吧?那么昨天大家想想我们是不是可以放在这,他没报错,然后放在这呢,对吧?这块呢,它也没报错,对吧?而且呢,他俩效果其实是一样的,对吧?那我更希望大家咱们放在什么位置呢?对吧?其实这块大家想一想,我如果要是我扎住代码的话,如果扎住代码的话,同学们对吧,你如果把它放在外边,这个其实它是不允许的。
14:28
大号代码,它这些语法就报错了对吧?那如果是我们现在呢,这个SKY代码的话,那你放在外边也可以对吧?那这个表示什么含义呢?同学们说我现在呢,调到咱们这个方for RD,这个for hardd它本身是什么,它本身其实是不是一个我们这个函数啊,然后这个函数里边它本身是不是有参数了,对吧?你看咱们现在这个东西其实什么,其实是我们这个参数的形式吧,对吧,就我当前这个函数对吧?它呢需要一个参数,这个参数本身是什么,这个参数本身是不是又是一个函数啊,也就是说啊,咱们当前这个for in r DD,它从这个块开始到这个块结束,它整个这些东西都是什么,其实呢,都是一个我们这个函数的参数的实现,对吧?只不过呢,它是一个函数对吧,那么它这个函数的话,那咱们现在这个函数在执行的时候,对吧?那么这块是什么,这块是不是应该是我们这个函数的这个参数,然后这块是不是应该是函数体呀?对吧?那大家想一想,那么我现在呢在执行。
15:29
的时候,就算你把它放在这儿了,大家想一想,那这里我是不是可以把这个东西相当于啊,我再做一个包具,呃,包包包包含对吧,相当于做一个这样的包含是吧,大家想一想,这个东西我只不过我给省略掉了。什么意思?这个是我函数参数最外边这括号最外边这块这是什么?这是函数题吧,在函数题里边,我上面包含什么,我包含了一个代码块,这个下边这句是不是也是我函数题里边的一个代码呀,对吧?所以说整个啊,咱们现在在我这个这个这个处理的时候,RDB后边这些内容都是什么,都是函数体啊,都是函数体对吧?所以说你把它放在函数体的什么位置都可以,对吧?但是我建议大家想一想啊,是不是直接咱们括号包起来的,这个结束的位置就是函数已经结束了呀,对吧?所以说呢,我建议其实放在里边更好。
16:18
啊,我建议放在里边更好啊,但其实如果说你要放在外面的话,这个也没问题啊,也没问题。好了,这是关于我们昨天的内容,我稍微停一下啊。
我来说两句