00:00
嗯,来吧,各位同学,那现在呢,我们再来看一下他的每日状态,应该怎么去做好,那现在我把视频录上,咱们看每日啊,OK,好,那想想这个每日怎么做呀。啊,首先需要先明确一点,就是每日我们在这儿呢,以2020年6月15号的数据为例啊,当然这个数据咱们仍然是没有啊,所以在这儿呢,我们还是保证逻辑对就行了啊好了,那现在我们来看看这个东西,呃,先明确一下咱们每日装载的这个具体的任务啊,咱们要做的任务是什么呢?就是想办法找到15号这一天的加购操作是不是就OK了,对不对?OK,怎么去找,从哪去找?其实说白了还是得从抗日info那角边去找吧,对不对,你影响谁就从哪找吧,对吧,那完之后抗日info找到之后,我们还得怎么样,是不是还得去跟这个编码表去关联一下对不对?所以说你会发现实际上这个首日跟每日他们大体的这个circle的结构应该是差不多的,对不对,也是拿这个跟这个进行关联,对吧?啊,当然里边可能会有一些细微的区别啊,所以在样呢,咱们不用再从头写了,我们把这个首势的S号啊,再给它拿过来,然后咱基于这个给它改一改是不是就行,对吧?好,那现在我放在这个位置,咱现在就开始改了啊,首先我们现在先改,先改子查询呗,先先从第一个子查询开始改起啊,像这些拿不到的,我就先给它去掉了啊,哎,不用让他再占地方来,那现在咱们改一下。
01:15
嗯,那首先咱们从哪开始开起。还是这张表,这个没得说对吧,然后呢,日期得改一下,这回我们得拿第二天的分区了,对吧?诶一旦一旦这个分区到了第二天,那我们现在拿到的数据跟第一天是不是就不一样了,对吧?现在已经是真正的一个一个的insert update的操作了,对吧?啊是这样的,这个一定要注意好,那接下来我们继续啊就行,分区改来说接下来。这个类型怎么办?类型肯定不能用不r inser了,对吧?第二天之后是不是没有这种类型的,对吧?那我们应该要哪种类型,是要inser的呢?还是要update呢?诶你要什么类型,是不是还是应到应对应到那句话呀,对吧,你得知道加构到底会对它产生什么影响,对吧?Ins s update对不对?哎,其实咱们之前分析过了啊,哎,我们是不是两种情况ins inside,它也是加构,是不是update,有些情况下也是加高啊对吧?那所以在这儿呢,我们应该要这样的两种类型,那这个过滤条件我们应该怎么写呢?咱得这么去写啊,咱得来一个type,等于是不是首先来一个insert,然后后边还得再来一个啥。
02:16
再来一个二吧,对吧,2TYPE等于是不是up data update呀,对吧?哎,这个得搞清楚,这是两种操作,咱们都得要好,那当然呢,呃,这里边由于这有暗的,我这儿有二,对吧,考虑到这个优先级的问题,咱们应该怎么办呢?在这呢,咱给它加上一个括号对吧?哎,这样一来这个不用不容易出错,好那现在我们就按了,那所有的音ER的类型的操作都是加构操作,这个大家应该是没有意义的,对吧?但是所有的update的操作都是加构操作嘛,这个就不一定了,对吧,我们得保证什么呢?啊,就是说首先你改的字段,你得是哪个字段才行。得是SKU number这个字段才行,对不对,因为我们前面讲过,就是这个表会发生变化的字段不只有这一个,对吧,我后边的什么,呃,Is order的是不是也可能会变呀,对吧?那这样的这个变更操作,那它就不是加构操作的对不对?那所以我们得保证修改的字段得有谁呢?得有SQ number还得保证呢,什么这个字段的值它得是往大了变才行吧,你往小变,那那就不是眼光操作了,对不对?那所以在这儿呢,咱们就得去把这个逻辑给它体现出来,那这个怎么体现,是不是只能是在呃,Type等于update这个后边再补上一些判断条件啊,对吧?好,那现在咱们就开始补,那这边为了区分它跟in那个我也加一括号,这个是不是看着更清晰一点啊对吧?来咱们在这个诶括号里边去写,那怎么去写呢?首先tap得是update类型,还得保证一点,保证什么,本次修改的字段有谁。
03:42
得有那个SQ number才行,好,那这个怎么去判断呀,这个怎么去保证?诶对,那咱们得知道啊,这里边有一个关键的字段是比较重要的,这是咱们对应的那个增量表对吧?哎,你按CTRL,然后点开一下就能跳到这个表建表语句这个位置啊好,那完之后呢,我们看这个地方old,诶这个其实比较关键,大家还记得old放的是啥吗?哎,如果我的这个变更类型是update,那old里边存放的就是什么?是修改之前的数据对吧?然后修改这些数据,它有一个特点,它只会包含什么样的字段。
04:15
只会包含修改的字段,没改的不会在里边,对吧?那所以说我是不是可以根据它去判断本次修改的字段到底有没有SQ number的对吧?好,那问题来了,怎么判断?你怎样判断这里边儿有没有那个SQ number?这是一个什么,这是一个脉嘛,对吧?哎,好问题来了,怎么判断。怎么去判断一下。是不是可以有这样的一种思路,什么思路呢?就是你可以先尝试着从这个O里边,这是一个map,对吧?取一下那个SQ number那个字段对不对?如果说我能从里边取出来它的值,那就表明里边有它,对吧?那如果我取出来的是一个什么,是no,是no,是不是就表明这里边是没有它的呀,对吧,没问题吧,所以说在这呢,你可以根据它去做一个判断,也就是在这我可以怎么写,我可以这么写啊,And and啥,And是不是应该是old,怎么取值,是不是后边写一个方括号就行,里边再放个啥。
05:13
SKU number对不对?那后边补上一个什么,应该是is not no。对不对,那这样一来说就保障我们old里边是有SQ number的,对吧?哎,这是行的,但是实际上呢,就是这种判断方式在某些情况下可能会出问题。可能会出什么问题呢?咱们要知道啊,就是说我从这个O里边取出来的这个SQ number对应的value是什么?是你这个字段变之前的值对吧,修改之前的值对不对,那你想一想,有没有可能会像这样一个情况啊,就是我这个字段在修改之前,它就是闹值。对吧,比如说有一个字段原来是闹,然后呢,我现在把它变成一个不为闹,他知道有可能会有这种情况吧,对不对,要是这种情况下,你再用这种方式去判断修改的字段里边有没有他这个还是不太好使吗?
06:01
就不好使了,为什么不好使,咱们来分析分析啊,假如咱们举一个例子,比如说SQ number这个字段,他在改之前它就是闹,在改之前就是闹啊,OK,好,那完之后你想一想,你这么去进行,哎,这个判断的话,假如说我本次修改的字段有SQ number。假如本次修改的有s number啊,有SQ number,那old里边是不是应该有有这个字段呀,对吧?有这个字段,那完了之后你这么判断,你获取的值是多少。是不是no,因为你改之前就是no o里边放的是改之前的值对吧?好,这是有你获取到的是no,那如果我本次修改的字段没有SQ number,好,那O里边是不是就没有了,你没有它,你去获取SQ,你得到的结果也是什么?也是闹对吧,那也就是说,哎,你如果你这个字段改之前本身就是闹对吧,那你去从old里边获取它,不管你本次改的值有没有它好,那这个结果都是no,所以你这么判断是不是就不零了呀,对吧?OK,那这种情况下,那咱怎样去判断O里边有没有这个字段的,你就这么写在某些场景下是不行的啊,当然呢,其实对于咱们这个呃加购车这张表来说,这么判断有没有问题没问题,因为我这个SQ number它肯定不是no对吧?啊是这样的啊啊,那那假如说咱们这有问题,我可以怎么去写呢?
07:15
哎,咱们可以换一种方式去判断啊,在这呢,再给大家介绍一种方式,你这可以怎么做呢?哎,在这呢,给大家介绍一个函数,这个函数叫做map case,当然还有一个与之对应的叫做map values,对吧?Map case呢,就是获取什么获取这个map里边所有的K对吧?那它返回的值是一个什么呢?是一个数组,是一个have当中的A类型对吧,叫数组啊好,那完了之后数组里边的元素是不是就是这个map里边一个一个的K啊对吧?好,那现在我的问题就已经转化了一下了啊,我我由什么转化到什么呢?由判断map里边是否有一个K转换成了什么呢?转换成来判断一个数组里边是否有一个元素了吧,对不对,OK,那怎样判断一个数组里边有没有一个元素呢?哎,再给大家介绍一个函数,这个函数叫做ara contains,这是还有当中的一个函数,OK啊,那这个函数它的作用就是去判断一个数组里边有没有一个元素,这个函数怎么用呢?首先它需要接收两个参数,第一个参数那就是啥?哎,就是这个数组,第二参数呢,就是你要判断那个元素,那它返回的值是什么呢?
08:15
这个函数反应值是什么呢?是一个不尔类型的值对吧?如果包含则返回true,如果不包含则返回false,对不对,那我是不是只要这么写,然后怎么写呢?来咱们往下放啊,放一个啥,放上刚才咱们那个所有的K对不对,然后后边呢,我再来一个啥SK number对不对?只要它这返回处,那就意味着是不是old里边是有SQ number量对吧?这样就能确保本次修改的字段是不是包含SQ number了对不对,这样一来也能判断,而且这么判断是更准确的啊这个理解一下,那咱这就这么写吧,就不改回去了啊,那接下来咱继续往后进行,呃,那也截止到现在呢,我们能保证本次修改的字段里边有这个呃SQ number了,对吧?那接下来继续往拿走,那我们还得保证什么来着?还得保证你这个SM值它是往大了变了对吧,怎样保证呢?是不是只要呃,改之后的值比改之前的值是大的就行了,对吧?好,那改之后的值位于哪儿,位于date里边吧,对不对?改之前的是不是位于old里边对不对,这个咱们之前是说过的啊来,这个是改之后的,这个是改之前的,那所以在这呢,咱们就得,哎再加上一个判断条件,应该是and and啥先取,比如说先取O的吧,那就是O的里边的这个呃,SKU,然后下划线number对不对,它的值应该是哪是不是得是怎么样的。
09:30
呃,当然是,因为它是O是改之前的嘛,你就得是小于改之后的值对吧?那改之后的值应该是date里边的SKU number对不对,这这里边要注意一下O咱们是map类型,这个呢是呃结构体类型对吧?好了,那这样一来我们就已经准确的拿到了加构的操作了,对吧?好,拿到之后呢,我们可以先尝试着把这个circle执行一下来走,哎,执行之你会发现他报错了,对吧,他报的是一个什么错呢?看能看懂啊。他说什么不安全的比较between between什么different types对不对,也就是说在两个不同的类型里边去进行比较是不安全的,对吧?诶,哪两个类型是不一样的呀。
10:11
是不是就他俩对不对,它这个其实之前咱们就提到过,因为old咱们当时考虑到一个问题,什么问题来着,就是你修改的字段不固定,所以我们这用的是map对吧?啊KY这都是SP,那你这个呢,这个是不是一个int类型,所以他俩没法比对吧?啊那所以这块得怎么得转一下对吧,咱转谁你得转这个它是不是才行对吧?来我们需要给它cast一下啊,把它cast成这个,比如说int应该就OK了,对不对?那现在呢,我们再去做一个这个比较,那我们看看这回能不能OK啊,啊当然在这呢,咱们即便是OK,它也不会有数据的啊来执行一下,哎,至少他不报错了,说明语法没问题了,对吧?好了,那截止到现在呢,我们就已经完成了这部分的工作了,好了,那过滤条件改完了之后,你说我们上面选的这些字段,咱们要不要改一下呢。要不要改,咱们来分析一下啊,你要保证你这儿拿出来的字段是什么,你得保证你拿出来的字段是谁对不对,在什么时候对不对,把什么商品加到了购物车里,你加了几件对不对?没问题吧,你得保证你拿出的是这个东西,那我们现在拿出来这些值是是我们刚才所描述的信息吗?是不是咱们来分析分析啊,首先UID是不是能表示是谁完成的这架构操作,这个没问题吧,好,接着往下走,那SQID呢,这个也没问题,然后注意观察cur time这个能不能作为我们那个加构操作的时间。
11:28
能不能,你要知道这个cur time指的是什么?指的是什么?实际上指的是我们这张表当中,是不是这个人第一次把这个商品加到购物车的时间呀,对不对?但我们刚刚拿的那个加购操作,有的可能是哪种情况,有的可能是,比如说他是第二次把这个商品加到购物车里,对吧?那你这一条操作记录的cur time能作为本次操作的这个时间吗?是不能的,所以说你这用cur time去作为加时间就不合理了,那咱们用谁比较合适呢?哎,对,用TS行不行。
12:01
TS行不行,TS上是可以的,为什么TS可以很简单,因为TS指的是什么来着,是我这个变更操作的时间对吧?那我们的Java操作可能是in sir,也可能是update,但是甭管是哪种,你这个TS是不是都是你这个操作的时间,对吧?所以说我们用TS作为这个加构时间其实比较合理的,所以在这儿呢,我们这个create time是不是就不能用它了呀,对吧?来把它去掉,但是TS这有一个问题,它是一个什么类型的呀?它是一个这个时间串对不对?那最终我们需要用到的是什么?是一个这种时间字符串对吧?所以一会儿我们是不是得涉及到一个转换的工作,对吧?这个转换怎么转,咱们一会来说先把这个TS先留下啊,啊继续往下走,那这个source ID source type应该没啥问题,关键是这个SQ number,这个SQ number在这儿的作用应该是咱们那个不良值对吧?那他理论上应该表示的是啥?是本次加构操作,这个人加这个商品一共加了几件对吧?但是你现在拿到的是什么?是一个date里边的SQ number对吧?那这个date里边的S判断矢量指是啥?
13:01
指的是我这个加完购物车里边一共有几件啊对不对,那所以说这个是本次加购的件数吗?并不是,那所以说这个它也不能行,那这个应该怎么改呢。应该怎么改?哎,对,你应该分情况去讨论啊,如果说我本次这个加操作是一个in色的操作,对于in色的操作而言,你说我这个date里边的这个s number能不能作为本次加构的介入,能你加速什你in inside是没问题了,但是对于update来说那就不行了,Update你这个相当于是什么呀?对于update类型的操作而言,Date里边的数据是修改之后的数据吧,对不对,这是你加构之后的数据对不对?那怎样才能得到那个架构的件数了,你得用改之后的,是把改之前的那个减掉,取差值才是本次加入的键数啊对不对,这个一定要注意,所以在这儿呢,我们还得再对它进行一个哎调整,对不对?怎么调整呢?诶,我们在这儿呢,应该是写上一个,呃,什么东西应该是义务判断吧,对吧,如果我的类型等于是inert对吧,那我就怎么我就把这个date的SQ number是不是放在这就OK了,对吧,这个是没有任何问题的对吧,否则的话呢,我就得减一下了,对吧,我用谁减谁呢?是不是用改之后的这个值减去改之前的那个值啊对吧,把它放在这,然后呢,把它放在这之。
14:14
然后呢,我们再把它给它拿过来就完事了。哎,OK,那这个用不用转类型的,这个其实我可以告诉大家,他不用转类型,那现在呢,我们可以尝试着执行一下啊走。所你你看是不是能执行对吧?哎,那为什么这个就不用转类型了呢?给大家解释一下啊,这个道理其实很简单,你想啊,这块咱们这俩是什么,这俩是比较对吧,那上面呢,我是做减法运算对不对,OK,你要知道字符串和这个int类型的数字是不是都能够进行比较。对不对,但是字符串和int类型的数字,它们比较规则一样吗?不一样,Int我是不是根据数值的大小比较,那字符串呢,我说按照什么呢?比较是按照字典顺序比较,对吧,一个字符一个字一个字符的比对吧,所以说你这两个类型都有自己的比较规则,那我放在这儿的,我不知道按什么去比大小,我到底是按照字符号来啊,还是按照数字来啊,他不知道,所以说你必须得声明一下,但是对于这个减法运算而言,我是不是只有数字能做减法。
15:09
我的这个字符串能做减法吗?你做不了对不对,字符串做不了减法,所以说在这儿呢,哎,它就是能够自动的帮我们把这个字符串转成数字进行这个运算啊,所以在这儿呢,它其实是没有问题,但是下边必须得转啊,这个注意一下就行了,其实还有当中这个类型转换其实还是比较智能的啊,行了,那截止到现在呢,我们这个子查询就相当于是改完了啊,这里边逻辑还是有点复杂了,对吧?但实际上呢,你这块儿你要想写明白了,你怎样就能写明白了,很简单,你只需要记住一个原则就行了,你要知道就是加构操作是怎样影响那张表的数据的,你只要把这个真正的理解了,那这个circle其实就会解了,对不对啊,就这么个逻辑啊,行了,那接下来咱们继续往下往下走,下边是不是还得改一下这个子查询啊,对吧,这个子查询咱们怎么改。呃,其实把这个14改成15是不是就行了,对,它就是一个每日全量的嘛,对吧?那所以说拿到15的状态那就OK了,这个比较简单,行,那现在紫查询都改完了,我们再往上走,上边咱们是不是需要去处理一下这个最终的select的字段呀,对吧?首先这个地方咱们是不是就不能要了,还记得它是干啥用的吧,动态分区用的吧,这个时候就不能要了,对吧?那同理,我上面这儿呢,是不是得改一下这个具体的这个分区的值啊,对吧,我们应该放在哪儿,2020杠零六杠幺几。
16:21
幺五这个分区没有问题,好继续往下走,那下边咱们需要做什么操作,呃,哪报错是不是改一下哪就行了,对吧?首先第一个就是SQ number这个之所以报错是因为我们下边这儿呢,没有写别名,哎,写上就行了,然后剩下的就是啥了,是不是就这两个时间了,对吧?这两个时间咱们应该取自于谁?TS,我们应该从TS里边去取我们想要的时间,对吧?那现在问题来了,这个TS是个啥东西?是个时间窗对不对,我们是不是得用时间串。转成相应的时间字符串了,对吧,好这个怎么录啊。诶,这个其实是咱们现在要哎重点讲的一个内容,因为以后大家可能也需要经常的把时间串跟字符串进行转换,对吧,或者说把字符串呢转到时间串等等等来回转对吧?这个东西咱们得会才行啊好,那就接下来呢,咱们单独的录一小节给大家简单说一下这个怎么操作啊,来视频我停一下。
17:12
啊好了各位同学,那这个接下来呢,我们说一下这个时间串到时间字符串的一个转换的一个工作啊好,首先先明确一下时间串到底是什么。呃,时间窗呢,实际上准确的说呢,应该叫做一般咱们所说的时间都指的是什么时间窗啊,都是unix时间窗对吧?OK啊这个unix时间窗,那OK,那它到底是怎么定义的呢?它标准定义是什么。大家都知道是自什么1970年1月1号00:00:00以来,所经历的什么秒数,或者好像也有毫秒,对不对啊,是这样的啊,其实标准的定义呢,指的是自UTC时间,UTC时间1970年,然后呢,1月1号00:00:00哎以来哎,经历的秒数,这是unix时间戳它的一个标准定义,但是现在呢,我们看到的时间戳呢,也有以毫秒为单位的,对吧?啊是这样的啊呃,这个大家要稍微的注意一下,完了之后呢,我刚才提到了一点啊,是自什么自UTC时间1970年1月1号00:00:00以来,对吧,也是我那个时间前面我相当于给他加了一个什么呢,加了一个时区,哎,这个一定要注意下,各位同学,就是我这个所谓的所谓的什么呢?所谓的这个时间对吧,你比如说我随便说一个1970年1月1号,对吧,你这个其实说的不准确,你说的是哪个时区的呀,对吧,对不对,你说的是咱们这个东八。
18:34
对的,还说的是那个呃零时区的呀,对不对,你其实这么说是不准确的,准确的说咱们应该是不是指定时区才行,对吧?那这个unix时间窗它标准的定义呢,实际上指的是UTC时间,UTC时间指的是什么呢?呃,它直译过来叫做是呃世界协调时间,对吧?啊是这样的,当然它其实说白了指的就是哪的时间呢?就是零时区的时间,相当于是啊,是这样的,也就是说所谓的优I时间头,它的标准定义应该是呃自一九,也就是零时区的1970年1月1号00:00:00以来所经历的秒数,这是UNI时间段的标准定义啊,这个大家一定要搞清楚啊。好,那接下来我们再继续往下进行,那我们刚刚所提到的那个以毫秒为单位的时间戳又是怎么回事呢?哎,其实呃,以毫秒为单位的时间戳跟以秒为单位的时间串,它俩其实就差了一个单位,是是是个道理吧,就差一个单位啊,那个算的是秒数,这个算的是经历的毫秒数啊,是这样的啊好,那我们通常看到的时间戳对吧,以毫秒为单。
19:34
单位的它有多少位呢。一般是有13位对吧,那以这个秒为单位的时间段是有多少位呢?十位对不对,它俩是这样的,当然这个位数大家知道它是固定的吗?它是一定永远都是13位,这个永远都是十位吗?啊,其实不是这样的啊,啊,为什么你想啊,它是自那一刻以来经历的秒数和毫秒数,这个你说我这个时间越往后走,我这个位数是不是可能会越长。有有是这个道理吧,对不对,但是呢,这个在很长的一段时间之内,那他们应该就是13位和十位应该是保持不变的,咱们应该是活不到这个变成14位,这个变成11位那个时候了,这个咱们理解一下就行了啊OK,好了,各位同学,那这就是咱们这个时间串这两个,呃,这个说明啊,好,那完之后呢,我们来看一下咱现在要处理的这个时间戳到底长什么样啊,这个时间戳来自于哪儿,应该是来自于这张表,对吧?好,那现在呢,我们select一下,然后呢,From from,那张表呢,应该是ods层的card info这个INC这张表,对吧,那我也不去过滤了,我就直接把里边的TS查出来就完事了,来咱们查一下。
20:35
大家看这个是多少位的呀,这是这个显然是十位的,所以咱这儿呢,应该是以秒为单位的时间串对吧?好,那现在我们就要考虑一下,怎样把以秒为单位的时间分转成年月日十分秒,对吧,怎么去转。啊,这个很简单,咱们转是不是肯定得接入have当中的一些函数啊,对吧?所以在这呢,我们就打开一下have的官网,咱们去找一下这个have当中相关的函数,来找到have官网,那找函数还得去哪找language menu对吧?语法手册,那之后呢,我们稍微的等一会儿,哎,这个官网加载有点慢啊,哎,我这个提前打开就好了,完了接着往下走,找到这个UD f udf,对吧?啊,也就是函数这一小节找进来之后呢,咱们找谁就行啊,你就找这个,这里边呢,有一小节是专门介绍日期或者要时间函数的,Date functions对吧?来,我们点过来。
21:21
呃,点到这个date functions,那这里边呢,有非常多的与时间与日期相关的函数,在这儿呢,我们先看一下咱们需要用哪个啊,我们先看第一个,第一个是什么,From unique time对不对?诶,这个东西是干啥用的,好像跟咱们这有点有点沾边对吧?来我们看一下后边它是干啥呢?它是convers the number of seconds对不对?然后呢,From unix epo对吧?这个unix epo指就是unix纪元对吧?这个纪元其实就是刚刚我们所提到的是不是UTC 1970年,呃,然后呢,呃一呃,就是1月1号00:00:00这一刻呀,对吧,就这一刻其实就被称为X元对吧,就是从这一刻以来所经历的秒数对吧?它是不是要把这个东西转成一个时间字符串啊,对吧?诶,这个所谓的秒数不就是我们刚刚所说的那个unix时间串的定义吗?对不对,那说白了,这个函数就是把时间串转成时间字符串了,好,那现在我们就来看一看这个东西能不能用啊,来简简单了解一下它的用法,它。
22:22
用法很简单,哎,我们只需要给他传俩参数,第一个参数就是一个big in类型的描数,那第二个参数呢,就是一个时间的一个字符串,一个一个一个一个格式化的字符串嘛,对吧?哎,那这样一来的话,它就能把一个时间串转成一个固定格式的时间走串了,好,那接下来我们看一看它能不能实现我们想要的效果啊呃,就在这儿呢,咱们怎么做,我是不是应该是直接调用一个from uniquete对吧?然后里边放啥呗,对不对,第二个放啥?是不是就格式化的字符串YYYY,然后杠DA,然后杠DD,好,那现在呢,我们执行一下好走哎,你看是不是已经把这个所谓的时间串转成了时间字符串了,对吧?好,那这个转的它准确不准确呢?准确不准确,其实我们光看到年月日是看不全的,对吧?我们应该看到哪才能看出来呢?得看到十分秒才行对吧?怎能看到十分秒呢?在这儿呢,我后边是不是得给它加点东西就行对吧?十应该是大写的H分呢。
23:17
应该是小写的M那秒,那小写的S对吧?OK,那13秒拿出来好了,那现在给我们转成哪一天了,是不是转成了6月14号的八点多呀,对吧?OK,好,各位同学,那这个时间准确不准确了。准确不准确的,哎,准确不准确得咱们得知道啊,就说我这个时间它准确的话,它应该是哪一科的时间,那在这我给大家解释一下啊,首先各位同学,我们现在这个TS是从哪拿的,是从这张表里拿的对吧?OK,这张表目前只有一天的数据吧,就是不是只有一天的数据啊,OK,那这一天的数据,那实际上呢,就是我们通过那个Maxwell的是不是全量同步同步过来的数据啊。没有问题吧,OK,好,那咱接下来呢,继续往下进行,那我那个Maxwell对不对,那它同步过来的数据里边的那个TS时间,那它是怎么得到的呢?我之前其实给大家讲过,就是Maxwell的输出对不对,输出的那个TS之间对不对,那理论上正常应该是什么?
24:16
啊,对于这种bootstrap同步的数据而言,那个TS应该指的是是不是开始进行boottrap的一个呃时间呀,对吧?OK,那对于我们的那个那个那个就是真正的这个变更操作的那些数据来说,那个TS指的是什么?是那个呃,就是操作发生的时间,对不对,是这样的啊,诶,但是呢,实际上我之前呢,呃给大家说过,就是我改过一点那个ma当中那个源码,对吧?呃,我是不是给他加了一个那个Mo data的参数啊,对吧?那我加那个Mo参数,我那个加的逻辑是什么样的啊,我加的那个Mo data呢,我只更改了那个,呃,什么东西啊,我只更改了那个那个呃,TS当中的那个日期,但是呢,那个时间部分我是没改的。能理解吧,啊,时间我是没改的,也就是说我那个boostrap它是什么时候开始的,那我那个时间是不是应该就是准确的那个时间啊,对吧?哎,我那个操作什么时候发生的,那我那个时间也是准确的时间,但是日期那是我们自己加的那个Mo date那个日期,对吧?啊,也就是说我们将之前我们什么时候做的bootrap,那这个TS它是不是该就是理论上应该是哪哪一刻的时间呀,对吧?好,那咱们现在回忆一下,我们那个全量同步是在什么时候做的来着,还能想起来。
25:29
可能想不起来了,但是我们这有视频,咱们去找一下之前的视频啊,然后打开咱去看一下,找到这个数据仓库,然后再找到视频,呃,咱们是在哪一天做的这个数据的准备,应该是第二天还是第三天,第三天找到第三天好,那完之后往下走,我们去准备数据的时候,应该是在这个位置去准备的吧。对不对,我们是不是应该是在16:29的时候去做的那个业务数据增量表的全量同步,对不对,所以说理论上啊,我们这儿把这个时间转换过来得到的十分秒,它应该是什么时候,应该是16点那个时候才对。
26:06
是是这个道理吧,应该是16点那时候,但是但是他现在显然是不对,但是八点多。哎,也就是这里边是不是跟咱们这块整的是有点区别的呀,对吧?诶这个时间差在哪儿了?差了多少个小时,差不多正好差了八个小时,对不对,其实这里边应该就出在哪呢?这个问题就出在时区上面了,哎是这样的啊,也是在这儿呢,咱们直接这么转,它是有时区的问题了啊,为什么会会有这个时区问题,我给大家解释一下啊,实际上呢,咱们来思考一个问题,大家说你说对于我们这个unix时间圈而言,它需要去区分时区吗?不需要我全世界的这个时区,甭管是哪个时区,你只要说到unix时间窗好,那你是不是这个时间戳的值都是一样的,对不对?因为什么呢?因为时间戳它的标准定义是啥呢?是自UTC时间的那一刻以来所经历的秒数,对吧?所以说你甭管是哪个时区,是不是理论上你要说时间戳都得按UTC那一刻去算呀,对吧?所以说每一个时区我的时间串都是一样的,对吧?但是我们再明确一下,你把一个时间窗转成一个具体的时间字符串的时候,你说你要不要考虑时区的问题?
27:13
要对吧,你把时间庄你转成零时区的时间,你跟你把时间庄转成这个东八区的这个时间,是不是理论上这个时间值应该是不一样的,对不对,那所以说在这儿呢,咱们在转的时候需要考虑一个时区,那现在咱们这个时区有办法调吗?没法调对不对,为啥,因为这个函数咱们刚才看了,它一共就接受俩参数,一个参数就是TS,一个参数就是啥呢。是不是就是我这个,诶格式化的字符串啊,对吧,我能指定我要把这个时间框转成哪个时区的时间吗?指定不了,那所以这个函数在这儿呢,就不好使了,那咱们用谁呢?我们继续看文档,往下翻,往下翻咱们看这个函数。当一个函数叫做什么呢?往下走,诶在哪呢?还没找着,诶在这呢,叫做from utc time step是不是就是from UT time,呃,就是这个是跟utc有点关系对吧?有啥关系呢?我们往后看,你看这个,哎,它给出的这个说明是,呃,将一个UTC时间圈转成什么?
28:11
转到一个given ta zone是不是给一定的市区啊,对吧?诶,那我们现在就要干啥,是不是就是要将一个UTC时间串转成一个时,就是咱们东八区的一个时间啊,对吧?OK,那这样一来的话,是不是咱们用它应该能实现我们想要的效果好那现在我们来看一下这个东西怎么用啊,首先那这个函数呢,一共接收两个参数,第一个参数呢,是一个any primit type啥意思?任意基本数据类型的一个时间窗,对吧?那第二一个参数什么呢?是一个time z,也就是时区没问题吧?好,那接下来我们看一看这个所谓的任意类型到底是啥意思,来看一下这里边怎么说的啊,他说你这个任意的基本数据类型呢,包括time date类型,Tiny in small in in big in来float double和是不是都可以啊对吧?OK,那所以说在这儿呢,咱们给它传啥是不是都没事,我们这这个时间应该是一个B类型的,对吧?那所以在这呢,咱们用它去试一下啊来这个拿过来我们调用一个,呃,From u TC time step,然后呢,这里边我把谁放进来是还是放TS对吧?好,那完事之后第二个参数咱们传啥来着?
29:14
第二条是不是要传一个时区啊对吧,十区咱是东八区,东八区在这怎么写呢?啊,在这儿其实有不同的标准啊,就之前咱们其实就是那个格林威置标准对吧?啊,那你那个时区就写什么,就写GMT就完事了,对不对,那你要是东八区呢,你就加一个加八,诶这就是东八区对不对,当然现在咱们这个新的这个世界,呃,协调时间的标准叫UTC对吧,你也可以写UTC啊,加码也行啊,那在这呢,我们就用GMT吧,啊GMT啊好,那完之后呢,我们,呃这样一来的话,就相当于把东八区就给他了,给他之后,那现在我们再来看一看我们这个值对不对啊,直接走一下,哎,这回好像更坏了,对吧,这个连这个日期是不是都不对了,对不对,这个是为啥呢?这个。你看啊,他这个得到的日期是什么,是1970年的,对不对,你其实可以大概猜测一下,你说这个问题它出在哪儿了。
30:02
应该出在哪?估计是出在这个时间中的单位上,对不对,上面可能是把毫秒当秒去算了呀,对吧,或者把秒当毫秒去算了对不对?哎,可能是这么一回事,那肯定是单位的问题,那接下来我们就来看一下这个单位怎么处理,他这个单位的处理逻辑比较奇怪啊,他是这么处理的,看一下。他说fractional values,什么叫fractional values呢?是不就是小数啊,对吧?哎,小数OK,小数会被当做秒,整数会被当成毫秒。哎,那咱们这现在给他的数是一个什么类型的,是整数啊,是整数,而我们这个值是一个什么什么为单位的呢?是秒为单位的,所以这是不是正好,呃,这个就是差了呀,对吧,就不对,所以说在这儿呢,我们得调整一下啊,要么我们诶把这个值给它转成一个小数,小数会被当成这个秒嘛,对吧?好,那要不说呢,我再怎么办呢?我给它乘个1000,乘1000之后,我这个是不是首先还是整数,然后我这个值是不是就变成真正的毫秒了,对不对,那这样一来应该就能解决这个问题,稍微有点绕啊来,那现在我们再执行一下,好,大家注意观察一下,你看现在这个时间对不对,是不是就变成了16:42那个时候来,对吧?那我刚才看的那个视频呢,是我那个,呃,应该是视频的创建的一个时间,那完了之后,咱们里边真正的生成时间应该差不多就是42那时候生成的啊,这个要稍微的注意一下啊,好了,那截止到现在这个时间,咱们就算是搞定了,就是最终咱们的方案应该是这种啊,但是这种呢,我们我们需要再给他再嵌套一下,再格式化一下,因为它里边是不是还有一大堆那个点0008对吧,他把那个什么毫秒也放里边了,咱们不。
31:32
需要啊,来把这个放进来,你要想格式化成年月日,那就怎么办呢?那就YYYY,然后杠MM,然后杠DD,那要是十分秒呢,那是不是就转成十分秒就完事了,对吧,也是在这儿呢,咱们应当用这种方式去搞定咱们这个时间段的转弯,稍微的有点绕,这个大家搞清楚好,这个拿过来之后呢,我们往上翻,找到谁找到是不是这个位置就行了,对吧?首先cur time给它直接替换我们后边的给它加上一个HH冒号MM冒号SS是不是就搞定了,对吧,那对于我们上边。
32:02
上面其实简单了,上边是不是直接把这个CTRLV给它替换隔式完成这个就完事了,对吧?诶好了,那截止到现在我们就已经完成了,咱这个每日装载的这个装载语句全部完成了,OK啊,那这个三个咱们现在就不执行了,因为没数据,大家知道这个逻辑是对的,就OK了,行了,完成之后视频我给他停一下。
我来说两句