00:00
然后我们看啊,这边刚才已我刷新这个按钮的时候,已经这个报错了,对吧,那报错之后呢,大家要点这个蓝色的小三角啊,点这点了之后呢,它会把这个过程给你列出来,看看哪部完成了,完成的地方呢,就已经是这个变绿了,完成就变绿了,嗯,然后哪步出错了,是是有这个红色的,那出错之后啊,大家看这块,我们这有一个这个小按钮叫log log啊当然你这个日志你可以在这个位置去看,或者你要不想在这看呢,你去哪看呢?你也可以去咱们那个,呃,麒麟的这个这个日志路径去看,还记得麒麟的日志在哪呢吗?CD到这个OPT。诶OT诶module,然后killing对不对,然后里边这是不是有一个log呀,Log,那这里边呢,也有咱们麒麟的日志,这儿也是有的啊所以这边呢,就是大家诶看哪都可以,那页面上能看,你就在页面上看,好那现在来看一看咱们这边这个这个这个东西啊,看他报什么错了来。点一下好,我们一起来看看这个错误啊,呃,就是有些同学呢,可能看到一大堆这个日志之后呢,他可能无从下手,不知道这个该看什么,就是大家以后啊,呃,看日志的时候呢,就是说这像一大串的这个什么艾特这些东西啊,你其实可以那个先不看先不看啊,主要看什么呢?一是看这个一大串艾前边那一行。
01:15
对不对啊,诶他可能会有一些这个错误的那个信息会给你打印出来,或者是怎么样呢,或者说看这一大串at之后,后边会有一个caused by,就是有什么导致的,有什么导致的是这样的,所以说这边呢,诶你大致是这么去看,就是所有的日志基本上都是这么去看啊。这个马菊兰,马菊兰是谁?来咱们看这边为什么报错啊,来我们看一看,那这边其实已经很明显了,已经很明显了啊,这边有一个呃,Caused by by,那这边我们来逐一的看一下啊,这边说什么the table the table,然后后边呢,这个哪个表啊,这张表。D。Team user for history,这是什么呀,这是呃,咱们那个拉链表吧,对吧,用户拉链表,他说这里边呢,这个MP key的。
02:06
Du什么意思?Dup它是不是就是这个什么意思啊,就是那个重复的意思吧,也就是说在这张维度表当中,我发现了重复的这个K了,这个K指的是什么?这个K啊,K指的就是呃,咱们这个什么东西啊,K呢,它指的就是呃,我实时表跟维度表进行join的那个字段,哎,也就相当于咱们那个相当于那个外键啊,当然在have当中,我们实际上是呃没有这个主外键那个东西的,没有这个概念,那这边就当做是那个外键,也就是他那个照的字段,照的字段来出现重复了,那这是为什么会出现重复的问题呢?其实这个很好,想明白,你想一想啊,咱们的事实表,事实表我们能够干什么,能够根据那个时间分区选出一天的数据对不对?那我们让他去join维度表的时候,你对维度表你做了任何的过滤了吗?你根本就没有做任何的过滤,也就是说我们的事实表是跟整张维度表进行join的,那咱们的这个谁,咱们的这个历史这个拉链表,用户拉链表,那我同一个用户ID是不是很有可能会对应多行数据啊?
03:11
对吧,因为这可能这一个人,比如说马菊兰这个人哈,他可能这个改了隐子信息对不对,比如邮箱啊,或者这个什么其他的信息可能改过,那你改了之后是不可能会有多行数据,那这样一来,我试实表拿着一个马菊兰的这个UID去用户表里边去找马菊兰的时候,那这时候是不是可能会返回多行数据,那咱们这个麒麟就懵了,就就蒙了,就有点这个蒙蒙蒙A是吧,他就蒙A,那OK,那他就会去想啊,我我应该照哪条数据呢,他就不知道了,所以说就会报这个错误。这是咱们这个问题的原因,这个问题的原因,那这个问题咱们怎么去解决呢?这是我们应该想的问题。咱们应该怎么去解决?我们刚才在去使用麒麟的过程当中呢,我们没有任何一步,呃,就是说体现到了去给维度表进行过滤啊,这些操作没有任何一步有这样的操作,所以说也就是麒麟呢,现在我们是这个没有办法靠他去解决这个问题的,我们只能怎么只能依靠我们自己去解决这个问题。
04:09
那现在大家开动脑筋想一想,如何去解决咱们这个所谓的重复K的问题。对啊,下边同学说的对啊,再来一张表对不对?那可以怎么去解决这个问题呢?咱可以这么去做啊,我们在have当中,咱们可以去建一张表,建一张表,建一张什么表呢?建一张。这事建一张咱们这个临时表,一张临时表,那这个临时表专门用来干什么,比如说我专门用来存储咱们这个用户维度表的全量最新。全量最新,那也就是说我需要怎么做啊,需要每天咱们拉链表更新完之后,需要每天从拉链表当中根据那个n date等于9999去把全量的最新数据给它过滤出来,然后insert overightt到这个中间表当中。然后呢,在麒麟当中我怎么做呢?我再去定义模型的时候,我让事实表去照咱们那个中间表。
05:03
对不对,那这样一来我是不是就能够解决这个所谓的重复K的问题啊,这是我们自己去解决,这是一个思路,这是一个思路啊,那这种思路呢,这个肯定能解决这个问题,但是相对来说实施起来要麻烦一些,呃,怎么样啊,你还得去再建一张表,然后呢,还得再去写一个circle,然后还得交给交给阿斯卡班,每天定时调度,对不对,可能这样要麻烦一些,要麻烦一些,我们这边呢,其实还有一个思路,告诉大家怎么去解决啊,我们往下拉。这边其实在这个3.2.5这一节呢,我已经把这个问题呢,给大家列出来了,就遇到这个问题怎么办往下走。嗯,那这个错误原因呢,已经分析过了,是因为咱们这边是不是有可能会有这个重复K的问题啊,重复K问题,那接下来呢,我们来想一想,咱们怎么去解决这个问题,怎么解决这个问题啊来往下看。呃,这个建峰同学这个呃脑洞倒挺大,维度和事实对,兑换对,也就是说你想怎么样啊,你想把那个呃维度给它当做那个实时表,然后你就能写过外过滤条件了,是吧?但你这样不行啊,为什么不行?因为我一个实时表啊,我需要去赚好多这个维度表了,你这个不行啊,不靠谱啊,而且你选度量的时候,你只能选实时表当中的度量值。
06:15
你要把维度当当成实值表,那你怎么选度量值呢?你选不了了,你这不行啊好,那家看我们这个,呃,下边这个第二种解决方案,第一种方案就是去建一个表,然后去存这个最新数据,那还有一种方案是什么呢?往下看。还有一种方案呢,我们可以这么去做,来看一下。我们方案二呢跟方案一思路相同,那方案一呢是我们建一张表,那方案二我们是怎么做呢?我们不建这个表了,我们不建表了,我们用什么呢?我们选用诶VU选用视图去实现相同的功能。那这个视图是什么东西呢?这个MYSQ当中,我不知道大家之前有没有讲过这个视图啊,呃,那这个MY色当中有视图的概念,我们have当中也有视图的概念,也有视图的概念,那这个视图呃,就相当于你它是怎么去用呢?就是说你可以这么去做,你创建视图的时候呢,是语法是这样的,就是create没用,然后后边加一个尾U的名称,后边接一条circle。
07:10
后边要circle,然后呢,后期你这个view建完之后呢,就相当于什么啊,你就可以把这个view呢当成一张表了,你就可以把它当成一个table了,那这时候你从这个table里边去选数据的时候,相当于是从哪选的,相当于是去执行了一下你创建VU的时候那条circle。诶是这样的啊,所以说也就是说我们其实可以使用咱们这个vu去干什么呀,去来代替咱们那个临那个物理临时表,那这样一来有什么好处呢?好处就是说我这个实际上我就不会真正的在这个维U下边去存数据了,它下边是不会存数据的,是不会存数据,但是你用物理临时表呢,你需要存数据,而且你用物理时表,你还得再额外的再给阿斯卡班再配置一个任务,那你要用VU呢,就不用再给阿斯卡班配置任务了。对,是这样的啊,那我们接下来看一看这个VU,我们应该怎么去创建,有这个视图应该怎么去创建,来大家来看一下。
08:05
看是这个位置啊,我们这个需要创建视图的呢,其实有这样的两种情况,一种情况呢,就是咱们这个拉链维度表,拉链维度表。对吧,那拉链维度表,因为我要去获取最新数据,那获取最新数据我这个视图应该怎么建呢?这么建create view,然后呢,就加一个view名称,后边as加一个circle,那circle应该是什么呢?就是select星,然后from dwdd user in for history,然后过滤条件就是end date等于999,那这样一来大家想一想啊,我这个把这张表交给麒麟之后,那我呃,每天这个麒麟去从这个视图当中去查数据的时候,就相当于什么,这就相当于执行了一下这个circle。那实际上也就是说每天它是不是自动获取的就是我这个最新的全量数据了呀,诶这是第一种这个视图,那除了这个拉链表,我有这种重复K的问题,那其实我们其他的维度表也会出现重复K问题,比如说谁,比如说全量维度表,那全量维度表是什么样的全量维度表啊,我们是这样的,诶是这个是不是这个多个分区啊,然后每个分区是不是都是全量数据,都是当天的全量,那这样一来是不是很有可能我这个某一个K会出现在多个分区里啊,那你让他去知道全表的时候,肯定也会出现类似这个重复K的问题,那所以说对于这个全量维度表呢,我也要创建视图,那他创建视图的时候,咱怎么去创建呢?诶往下看来,比如说咱们以这个商品维度表为例啊,那商品维度表其实也是一个,呃,它就是一个全量全量维度表对吧,那我看怎么去创建,那也就是语法还是这样,后边呢,接一个circle circle是select星,然后from你这个商品维度表,那后边呢,诶where where什么where dt。
09:49
等于啊,这个东西大家看一下。这三东西,这是where dt等于data I,就是说这个日期是不是这个,诶current date减一啊对吧,相当于是那current date是什么?注意啊,这个不是随便的一个一个一个变量,这不是一个变量啊,Current date呢,是我们have当中的一个函数。
10:08
注意啊,Current date是have当中的一个函数,它能够返回当前的日期,而且格式就是YYYY-MM-DD的格式,如说格式不对的话呢,你可以给它格式那个,如果说就是你们公司里边用的不是这个,咱们这个年杠月杠日用格式,你可以对它进行这个data form ma格式化,你可以格式化,反正就是给它格式化成你想要那种形式,然后后边呢,诶减个一,那我获取的是不是就是咱们前一天的数据了呀?那我们麒麟计算其实也是怎么做,也是每天获取前一天的数据,每天获取前一天的数据,那所以说咱这个视图这么去建的话,那就能够解决咱们这种全量维度表的这个重复K问题了。就这么建就行,也就说咱们在生产环下,你就这么建就可以了,你就这么建就行啊,那OK,那接下来呢,我们去做一个测试,少了括号是吗?我看一下没少括号啊,没少括号看啊这个date呢,这个东西是没有括号的。
11:00
它没有括号的这个东西我们去测试一下吧,来我们打开这个,呃,这个have啊,咱们去打开一个have。CD到,呃,OA,我是不是配了have的环境变量了,那我就直接have就行了,嗯,走。咱们去,呃呃,我们得建一个视图啊,咱们得建一个视图,因为那个我们当初选了一个用户拉链表是吧,那那个视图咱们得建一下啊,来咱们use g ma。呃,我可能要这个拖个一两分钟的堂啊,那个大家那个,嗯,那个就是拖就拖吧,你也没办法是吧,OK,那现在呢,我们先测试一下这个函数啊来CTRLC,呃,来,那现在呢,我们select一下select select直接加这个这个ctrl data就行啊来看那个回车。好,那你看它是不是就自动的返回了咱们这个当天的日期了啊,这个我集群时间现在是4月1号了,那就到4月1号了,那是自动返回的啊,如果格式不满足你的要求,自己格式化就行了,嗯,好,那现在呢,我们去尝试一下啊,尝试下什么东西呢?尝试一下我们去建一个这个诶用户维度的视图,因为我们需要用到它那CTRLC。
12:07
那OK,那现在呢,我们拿到这个地方按它,那OK,我们给它创建出来啊,创建然后回车。好,那这个已经创建完毕了,创完毕之后呢,那这个东西刚才说了,你就把它当一个表就行了,那你表怎么用,是不是S,除非就是你不能往里边inser的数据啊,就是你只能查,只能查select select星,然后from这张表,那你现在回车,诶,你就会发现啊,你查出来的数据呢,就都是这个9999的了。就都是9999了啊,所以这块呢,大家要注意,就都是这个9999了,好,那这个就是我们创建这个视图,这就是我们创建视图这个方式啊,视图方式。嗯,OK,那神奇这个即是函数也是变量嘛,是这样,因为它没有参数就没有参数,所以它括号给它舍掉了啊,那CR date是不需要传三的,所以就把括号给你扯掉了,是这样的啊好,那现在咱们这个呃,什么东西呢?那现在咱们这个这个视图咱们就建完了,那建完之后呢,那接下来咱们得去解决他这个cube的问题,对不对啊,那怎么解决呢?那这时候呢,你需要去诶做几件事,来大家跟我去看一下,你需要做几件,做什么事呢?首先呃呃,你得干什么,你得把咱们那个数据源是不是得变一下了呀,我们需要导一张新的表进来,对不对,那这个怎么去导呢?来我们还是使用这种方式啊,点它。
13:29
然后呢,我们这回点击帽,这时候呢,我们搜一下咱们那个view,那这时候你搜不到,搜不到是因为什么呢?是因为你下边啊,你没有点这个show,把这个show点开啊,然后搜一下这个呃,View view,那把这个表呢,咱给它load进来,点击S同步。那点完之后呢,现在这里边是不是就有这样的五张表了呀,但实际上这里边有一张表我不需要了,谁他我是不是不要了呀,不要了之后怎么去给他干掉呢?来我们点一下这个表。不要点错了,这张表点点完之后呢,这边你看有一个什么东西,有一个安lo的tablelo table就是给给它去掉呗,那点点了之后呢,你会发现啊,诶他他这问你是否这个按lo的那yes思呗点。
14:09
诶,这时候他会报错说什么呢?诶,这个表啊,这个is already in use by,这个model,就是有一个model用上它了,对不对,那所以说你得干什么呀,你是不是得先把那个model给他,诶给他干掉,然后才能干他呀,对吧?那所以咱model这边呢,其实也也也要删一下model怎么删在这,这是咱的model啊,所以点action,然后点击这个drop点。然后点击yes,那这时候他又报错了,他说什么呢?你这个model盾你也删不了,因为谁呀,Payment cube用它了对不对,所以说还是不行,那这时候你是不是还得把这个payment cube先给他干掉啊,因为咱这里边东西都是错的,我们表都不对,对不对啊,你给干掉,那怎么怎么干呢,点job,那点job的时候呢,咱们点击这个yes。诶,然后他又报错了,说什么呢,你一个Q吧,也删不了,为什么,因为我后边呢,诶有一个这个任务是不是正在用着这个东西啊,那所以说还得干什么,先把那个任务先给他停掉,那点monitor.monitor啊来monitor之后呢,我们点这个位置,点action action里边呢,有一个这个discard discard就是这个取消的意思,点它点yes,然后这时候呢,变黑了,变黑之后呢,点击action,点击drop。
15:13
然后删除,那删除完之后呢,这时候我们就可以怎么做了呢,我们就可以回过头去去删咱们这个cube了,你看我现在把cube删除drop,然后呢,点击这个yes。然后呢,这时候Mo呢,我们才能删,然后点击drop,然后点击yes,那完事之后呢,这个data source这张表呢,我现在才能删点它,然后点击这个诶按load点点yes,好,那现在呢,咱这个表就完事了,好,那接下来我们要做的事是什么呢?接下来我们要做的事啊,就是按照我们刚才我们那一步干什么呀,就是从干创什么,创建model,然后再去创建Q吧,然后再去计算,然后诶从头到尾呢,它就能够计算成功了。诶,这就是咱们今天的这个这个任务行,那这个全干掉了,有点可惜,这个没办法没事啊,呃,就是咱们自己去做的时候呢,你就可以没有必要按照我这个流程了,你最开始的时候你就用那个view就行了。
16:10
最开始就用尾U就行了,你就不用再去这个删,然后再去重导了,是这样的啊好了,那我现在呢,就这个不再去演示,怎么去重新创建了,这个重新创建呢,跟我们前面那个那个任务是一样的,然后这个我一会那个课下之后呢,我自己再按照前面那个那个过程呢,再从头到尾去创建一下,整个配置跟前面的配置是一模一样的,只不过就是咱们那个呃,表变了一个,表变了一个,别的都一样行。没有修改,唯一的修改就是你再去,诶,比如说构建cube的时候啊,你这边选这个选什么呀,选实时表,选维度表,咱们那个维度表是不是变了一个呀,其他的东西都没有变,其他都是一样的啊,其他一模一样,就这边呢,我就不再这个演示了,不再演示了啊好了,那我现在把视频录一下。
我来说两句