00:00
好,各位同学,那接下来呢,我们再来看一下这个preal的啊,在使用过程当中的一些注意事项啊,那我们现在先看1.3这一节,来我们看一下这个标题是什么,标题是press的优化值数据存储,诶这个怎么理解,它是不是不负责数据存储啊,Press是不是只负责计算对不对?那其实这个存储指的是哪的存储啊。指的还是have,也就是HDS这个数据的存储,能理解吧,就这个意思啊,那假如说啊,我现在呢,有一些表,当然指的是have当中的表啊,有一些have当中表需要交给普去进行查询啊,那OK,我这个have这张表它的存储格式应该怎么去选择呢?来我们一起来看一下,首先第一个哎,分区合理设置分区啊,什么意思啊,就是我们这个preal呢,它是能够识别hi当中的分区的啊,它也会根据我这个分区来去过滤数据,你根据分据过滤数据,是不是要这个效率要更高一些啊对吧?那所以说假如说这张表哎,我需要使用price去查询,那这个分区你该怎么分就还怎么分就行了,普是能够利用这个分区的一个优化的,这个理解一下就行,好,现在往下走,那下边就是劣势存储和压缩了,对吧,那劣存储压缩我怎么选择呢?先看劣存储啊普to呢,它对orc文件啊做了特定的优化啊,对orc文件做了特定。
01:24
化,那所以说我们在have当中去创建pre使用的表示,那我们肯定选谁呀,是不是优先选用orc啊,对吧?啊相对于这个呢,哎,这个press对orc的支持是更好的,这个咱们要理解一下,好下一个关于压缩啊,其实这个压缩呢,对于来说,你说它是一个啥,是不是一个极袭查询框架,极其查询框架,那我要求就是啥,是不是有点快对吧?那所以我们,呃,对压缩呢,我们就选了一个什么样的呀,就是比较快的压缩,也就是这样,就是这个耐力啊,那所以说我们总结一下啊,那假如说have当中有一张表,那将来呢,需要交给普做这个框架去进行相应的统计,相应的查询,对吧?那这张表咱们的存储格式应该怎么选择,是不是就是orc加上snap啊对吧?哎,这个呢,大家需要去理解一下orc加snap啊好,那这是关于数据存储的一个说明,那接来往下走,那下边呢是这个press优化值查询serve,也就是我们在写serve的时候呢,诶有一些注意事项,咱们要一个一个来看。
02:24
首先第一个只选择,呃,只选择使用的字段,这个不用再多说了吧,这个是不是在汉文当中也是这个原则,对不对,你用不到的字段不要上来就塞来星对吧?那当然呢,如果说我确实就需要用到所有的字段,那我是不是谁来星也可以对不对啊,这个理解下行,这个不再多说,然后下一个下一个是啥?下一个是过滤条件必须加上分字段,那其实说实话这个啊,说的有点太绝对的,不是说过滤条件必须加上分区字段啊。那假设我现在我我就是要读全表的数据对不对,那那你必须得加加分区字段嘛,是不不需要了对吧?那这个他想说的是什么啊,就他想表达的意思应该是啊,能用分区作为过滤条件,尽量以分区作为过滤条件,这个大家应该是能理解的,对吧?啊,咱们举个例子啊,比如说我们以数仓当中的DWD层的订单明细事实表为例,以订单明细实表为例啊,那假如说我现在啊,要求大家从这张表当中去获取某一天的这个订单,你说你可以怎么获取啊。
03:29
我是不是可以根据cur time去过滤,我也可以根据DT去过滤,对不对啊,那这两种情况得到的结果肯定是一样的吧,对不对,但是他们俩的呃,执行计划是不一样的,如果你用可它会怎么做,会扫描全表对吧?那如果说我用DT去过滤呢,是不是直接定位到这个对应的分区路径啊,对吧?哎,这个效率还是有一定区别,所以这块呢,大家一定要注意一下,好,那就看下一个,下一呢是关于葛如拜分组啊,那这个分组这边呢,它这儿有一个相应的优化,一个什么优化呢?我们来看一下啊,那我们在这儿呢?哎,合理安排葛如拜语句当中的字段顺序,对性能提升啊有一定的影响啊,什么叫葛如拜当中的这个字段顺序呢?当然指的是啥?指的是我有多个分组字段对吧,来看一下啊,那要求我们怎么怎么去排列这多个分组字段呢?来我们看一下啊。
04:20
哎,对,其实还是跟那个基数相关啊,跟基数相关来看一下,那我们这儿有两个例子对吧,一个是good,一个是bad,对吧?那我们先看第一个good这个是怎么选的,是不是葛如by u ID加真的UID是啥?是不是就是U的ID,真的是不是就是性别啊对吧?那我们看什么?看它的基数,看它的基数啊,他俩谁基数啊,谁基数小是肯定是UID的基术单位吧?啊那OK,那这种情况下呢,Pre哎,它的这个执行效率是比较高的啊,那反之我把真的放前边,把UID放后边,是不是执行效率就比较低了呀,对吧?那所以说这样的一个要求,就是将葛如拜语句当中的字段按照基数进行降序排列,对吧?啊,这个咱们稍微记一下就可以了,当然这个东西呢,其实很容易记混的,你现在记得是降序,你可能到明年就记成生序了,对吧?啊这个所以说也不用说非得死记硬背,就是有知道有这么个东西,然后以后需要用的话呢,查一下就可以了啊好接来看下一个,下一个呢是order by的时候呢,使用limit limit limit,诶这句话其实说的好像也有点绝对啊。
05:20
Order by的时候使用limit,那假如说我现在就想获取一个全局有序的数据集,那你说我我需要使用limit呢?我能用limit吗?是不能呀,对吧,是这样的,所以这句话其实说的也是有点绝对的啊,不是说order by的时候一定得使用limit,这个当然是要不要用limit得得由什么决定吗?实对实际业务要求决定对不对啊,哎,不过呢,好在什么啊,好在我们通常情况下啊,我们跟排序相关的需求啊,我们只需要去查查什么呀,Top n或者是N。啊,就是我们很少哎,会让你去查询全局的一个有序的数据集啊,很少一般情况下就是看前几或者是后几啊是这样的啊top门就是前几,包特门呢就是后几,是这样的啊那所以说呃,我们既然这个大多数的业务要求是不是让我们取的是前几和后几啊对吧?所以说大多数情况下,我们的O后边是不是肯定会带着一个limit呀,啊是这样的啊,那他这其实想表达的是什么呢?实际上他想表达的是我这个进行排序的时候啊,有limit和没有limit,它的执行逻辑是不一样的。
06:27
啊,这个怎么理解啊,咱们先来看一下,假如我现在没有一个limit,没有limit米,没limit,假如这是我需要去排序的一个大表,对不对啊,那你需要怎么做呀。你需要怎么做啊,首先我我可能刚开始的时候,我会并行的去处理对不对,比如说把这个数据呢,分成若干份,比如1234分成四份,那分成四份呢,我是不是每个呃worker可以获取到一份啊,对吧?然后进行相应的排序对不对,那他们排序之后只能保证啥,是不是保证自己这部分数据是有序的呀,对吧?我要想得到一个全局有趣的数据,我必须得怎么样。
07:00
你要想得到一个全局有趣的主题,必须得把所有的数据都写到同一个work才行。是这样的吧,你必须得把所有的数据都放到一台节点,我才能得到一个全局有序的数据集啊,是这样的啊,那所以说这样一来势必会导致最后一个窝的压力是比较大的,对吧?啊是这样的,那这个肯定就会出现相应的倾斜问题,对吧?这相当于是map和reduce的一个倾斜的,对吧?就这个意思啊,OK,那这个显然是不太好的啊,那相反,如果我现在有limit呢,有另个我还是这样的一个大表啊,我还是要对数据呢进行这个相应的排序,那比如说我现在LIMIT100,那我就可以怎么做了,我就可以这样去做了啊,比如说我每一个work克,我先求自己的前100。是是这个道理吧,然后呢,我只需要把每个worker的前100给它放到最后一个worker里边,那这样一来是不是就能得全局的前100了呀,哎,就这个意思,那所以说有limit和没limit,它的执行计划是不一样的,它这表达的其实就这个意思啊,好,那咱们这块呢,也理解一下就行了,好最后我们再看这个job啊,那他假说的时这说了一个什么呢?说呃,使用状语句的时候呢,要求我们将大表放在左边。
08:10
大表在左边,那也就是大表在前,小表在后,对吧?啊,这个其实怎么回事呢?呃,这个好像have当中,我们之前在学习的时候也提到过类似的这个做法了啊,但但其实have现在已经不需要去关注谁在前前前后了吧,他已经优化了啊,是这样的啊,那press这里边了,还有这样的一个要求啊,那完之后给大家简简单说一下啊,那为什么我们要将大表放在前边,小表在后边呢?这个呢,其实跟这个price当中的join算法是相关的啊,普当中join算法默认是什么呀?是broadcat broadcat什么意思?广播的意思对不对?广播,这个广播咱们怎么理解啊?其实广播照呢,就和我们在have当中学的那个map John是一回事,大家还记得map吧?还记得是Mac转吗?啊,它这儿其实跟那个map转是一回事儿,具体怎么做的呢?给大家举个例子啊,比如说在这儿呢有一个大表,这儿呢有一个小表进行关联啊,那它是怎么做的呢?诶,他会这样去做啊,这是多worker,假如说啊,他会先将这个小表进行广播,然后呢,让每一个worker都去缓存一份小表的数据啊,那之后呢,之后再去大点的数据进行切分,然后呢,诶把这部分给一个ER,这部分给1WORKER,这部分给一个worker,那这样一来的话,是不是每个worker里边的数据都能够完成相应的join操作呀,是这个道理吧?啊这就所谓的广播状,那你能够看到广播join的时候呢,它会分发一张表,然后呢会切分一张表,对不对?那他切的是谁,分发的是谁呢?诶分发的是右边的,切分的是左边的,那所以说我们就得按照他的要求,是不是把大表放在前边,小表放在后边是这样的,这个理解一下就行,那当然了,有同学可能会说了,我要是大表装大表了。
09:55
我大大表照大表怎么?哎,这个你不用担心,大表照大表的时候呢,他用的就不是这个,我照你就不用广播照了,那他用什么照呢?用哈希状啊,这个哈希状呢,就有点类似于我们在学那个micro在学的时候讲的另外一种状语方式,另外一种方式叫什么状。
10:15
叫reduce状对吧,或者叫做沙佛状,是这样的啊,那具体怎么做呢?很简单,那哈希哈希,那是不是得有一个哈希字段啊,对吧?那以谁作为这个哈希的字段呢?那是不是就肯定以这两张表的那个关联字段对不对,以关联字段作为那个哈希的字段对不对,那这样一来他会把什么样的数据发发在同一个,呃,同一个窝对吧,他是不是会把本来应该关联到一起的这部分数据发到同一个。是这个道理吧,啊,那OK,那你需要关联到一起的数据放到一个窝份之后,那他们是不是就能完完成相应的关联了呀,对吧?是这样做的,哎,这是大表,照大表它的一个算法叫做哈希症,那当然这个咱们了了解一下就行了啊OK,好,那这个呢,就是我们讲到的,我们写S的时候的几个注意事项啊好,我们再看最后边,最后边呢,还有几个注意事项啊,这个几个就是一几个杂项啊,咱们单个看一下就行了,来我们一个一个看,先看第一个关于字段名的引用,关于字段名的引用啊,那大家都知道啊,我们在买思当中也好,在汉当中也好,我们再去见表的时候啊,见表的时候,或者你写思的时候,是不是可能会引用到这个关键字呢?对吧,比如说我现在建立一张表,这个表的名字叫什么呢?表的名字叫order,你这个order是不是一个S当中的关键字对不对,那我我正常情况下你这样去见表,它会怎么样,会报错对吧?啊是这样的,那我如果说我现在就要用order作为我的表名,你说你应该怎么办?
11:41
在MY或者在have当中,咱是不是可以给这个order加一个反引号啊,对吧,加一个票号,那这个票号或反引号就就用来干啥的,是不是就用来声明声明,我现在这个order不是关键字,它就是一个普通的字符串,能理解吧,是这样的啊,那在但是呢,在这个呃,Press当中啊,我要想实现相同的功能,那我用的不是反引号,那我用的是啥呀?
12:04
是双引号,那这个大家要注意一下,还是有一定的区别的啊好,那接下来我们继续往下看下一个,呃,杂项啊,下一个杂项是什么呢?是关于这个时间啊,关于时间,关于时间的什么呢?关于时间的比较,关于时间的比较啊,OK,大家都知道啊,那我们这个have或者MYSO当中是不是都有这个时间字段的类型嘛,对吧?比如说date类型,比如说date time类型,比如说time step类型,这些是不是都是与时间相关的类型,那但其实我们的数仓里边,咱们用到这些时间类型的吗?咱们用咱们所有的时间都是啥类型啊,我们我们都用的string类型对吧?啊是这样的,那咱们现在针对的是这些时间类型啊,Data data time以及time啊这一类型,那在press当中啊,这个呃,这些类型我们去使用的时候也是有一个注意事项的啊,注意什么我们往下看啊。来,我们先看这个。大家可以简单看一下这个词,看看这是啥意思,Select t什么from a,然后后边是不是有一个过滤条件,咱们重点看这个过滤条件啊,这个怎么写,是不是直接T大于后边这一个啥,是不是就是一个时间的字符串啊,对吧?啊,这个T在那指的是什么啊,T在那指的就是一个时间类型啊,就是time step或者date或者或者是date datetime啊这样一个时间类型在have或者在my serve当中啊,我们这种时间类型的值,时间类型的字段是可以直接与my sir呃,直接与这个字符串进行比较的啊,这个要理理解一下啊,也就是在my serve或者have当中,我们这个时间类型字段是可以直接跟字符串进行比较的。
13:36
啊,那也就是在比较的时候,它实际上会做一个什么操作呀,是不是会自动帮我们转换一下这个类型,它会去比的,但是在当中你这么写行吗?那就不行了啊,他比不了,因为两边类型不一样,对吧,你要想比就得怎么办。你就得这样去做,你得在后边的时间字符串前边加了一个啥呀,哎,加上一个这样的type step关键字,那这样一来相当于显示的是不是做了一个转换呀,对吧?显示的将字符串来转成了时间的类型,那这样一来它才能进行相应的比较啊,这也是presss跟我们have或者是MYS当中的一个区别啊,这个理解一下啊,最后我们再来看一下啊,那这里边我们还有一个小知识点啊,什么知识点呢?就是说pre呢,它是不支持insert or right语法的,它不支持insert right,你要想实现相同的效果,只能先这么做,只能先删再写入啊,是这样,当然了,这个其实它会影响到我们我们的使用吗?这个不会,为啥,我们还是还是那句话,我们用它干啥?是不是做查询的呀,做机器查询的对不对,那我们去网表当中装载数据那一套还是谁去做呀,是不是还还要去做呀,对吧,所以它不支持in也没没也没问题啊好最后一个小点来看一下这什么,这是presal对于亏的这个格式的一个支持程度,那现在的这个。
14:52
它是支持part规则格式的,但是只是部分的支持,它只支持啥呀?只支持查询,不支持inert,也就是说是不是只能读不能写呀,对吧?那还是这个道理啊,你说它影响我们的使用吗?不影响,因为我们用press主要是做查询的,对吧?所以这块大家理解一下就行了啊好,那press的全部内容咱们就讲完了啊,来,我把视频停一下啊。
我来说两句