00:00
来,我们现在先看这个1.3啊,1.31.3这是什么呢?叫做presal优化之数据存储啊,也就是说在这儿呢,我们其实也谈不上什么优化吧,也谈不上什么优化,就是呃,如果说我有些表,我需要让这个press去查询,那我这个数据的存储格式应该怎么选择,其实就告诉大家这个事儿啊,来咱们看一看这里边的三个点,那一个呢是关于分区,一个是关于劣势存储,一个是关于压缩啊,那这些呢,咱们怎么选择呢?一个一个看啊,先看第一个,哎,合理设置分区。合理设置分区啊。呃,这边想告诉我们的是什么啊,就是说与have类似,Price呢,会根据原数据,谁的原数据啊,就是have的原数据对吧?会读取分区数据啊,也就是说什么意思,就是PAL,它是不是也能够识别咱们have的分区啊?对不对,只要能识别分区,那我去以分区过滤数据的时候,那你的效率是不是就会很高,对不对,不用全面扫描嘛,直接找那个路径就行了,那所以说既然press能够识别还有的分区,那所以说我们合理的设置分区,是不是能够减少press这个全秒扫描的这个几率啊,对不对啊,能够提升性能啊,所以说这边呢,你就呃这个当中,咱们这个数据该怎么分区,你就还怎么分区就行了。
01:15
啊,你比如说咱们现在我们离线计算,那因为离线数据,离线计算的时候呢,我们更多的是不是就是一天数据一天数据去计算呀,对吧?那所以说我是不是更多情况下就是按天去过滤数据,对吧?所以说咱们按日期分区,那这个是不是就比较合理了呀,对不对?那假如你后期我有一张表,我可能会按照什么,比如说按照省份啊呃,按照市,按照区区分区啊,区区过滤啊,那这个是比较频繁的,那你是不是还可以按照啊,什么市啊啊什么省啊,什么区区分区是不是也是可以的呀,对吧?你得看你具体的这个查询场景了啊啊,那所以分区对press同样有效啊,啊记住这点就行了,那接下来重点看下面这个劣势存储和拉类和这个压缩。那这边咱们呃需要怎么选择呢?啊很简单啊,Presal对orc这个劣势存储做了特定的优化,因为咱们大家之前在学劣势存储的时候,咱们应该呃讲过一个是pre,一个是呃不是pre,一个是那个paqui,一个是orc,对吧,两种那呢,它是对orc有特定优化的,那所以说那在have当中,我们去创建preal需要使用的表的时候呢,那我们就建议大家采用orc这种存储格式。
02:23
啊,是这样的啊,相对于per qui,那pre呢,对orc支持是更好的啊,也就是劣势存储你就选orc就行了啊好,那关于压缩咱们怎么选择呢?压缩这边呢,倒是没有提到说什么有特定的优化,那这边呢,我们就按场景去选择就行了啊按场景选择,那press咱们应用什么场景啊。因为什么场景啊,机器查询嘛,机器查询咱们追求的是不是就是快对不对,那既然追求的快,那我们选压缩是不是也要选一个较快的压缩速度这个格式啊,对吧,那谁最快呀。Snap最快,那我们就选snapy呗,啊,那所以说如果说我们还当中有一张表啊,后期需要交给press去做机器查询,去做机器分析啊,那这时候呢,我们就可以将这张表的列存储设为orc,将拉应压缩呢设为snapy。
03:13
就这么去设置就可以了啊啊,那怎么去建一张表,呃,去声明它的列存储为per这个orc,然后压缩格式为sleep,怎么去建表啊。这个语句大家会不会写呀?不会写怎么办?查呀,还有官网是不是肯定有啊,你就还有官网查这个肯定能找到的啊,那大家需要呃,还是得多看官网啊,多更网啊行,那接下来往下走,下边呢,我们看这个1.4啊,1.4这边呢,有一个pre优化之SQ查询啊,这其实就是我们在写S的时候呢,一些注意事项,咱们一个一个看啊,首先第一个。选择使用的字段,这个很简单吧,因为咱们是不是都采用劣势存储了呀,那你就不用赖星啊,你只选自己所需的字段,是不是这个效率是比较高的呀,这个不多说了,下一个。
04:01
下一个是什么?过滤条件必须加上分区字段。哎,这个好像说的有点是不,有点坏,有点太满了,对吧?什么叫过滤条件必须加上神奇之外呀。我我我假如说我就想查全表,你就想查全表也要加上分区吗。也要Y2分区等于什么不是吧,这个应该得根据场景啊,这边他其实想表达的意思是什么呢?他想表达的意思应该是这个啊,就是说啊,假如我现在有一个需求,我要读数据,对吧,我能以分区作为过滤条件,尽量以分区作为过滤条件。他想想表达应该是这个意思啊,那这么说可能还不好理解,我举个例子吧,呃,我举个例子啊,咱们现在以哪个表为例呢?以我们数仓里边的那张表为例啊,以数仓当中的啊认定啊,以数仓当中的这个DW defec older in four为例。啊DW defo啊是那个订单实时表对吧,以他为例啊,以他为例,那比如说我现在呢,想获取6月15号的全部订单的数据。
05:03
6月15号的全部订单,你说你这个应该怎么过滤。是不是咱们两种过滤方式啊,对不对,哪两种,一种方式select星from咱们那个表,然后过滤条件用谁用dt where dt等于六月15没问题吧,为啥?因为咱们那个分区的时候,我们前面强调过,我们每天的分区里是不是存放的就是当天所下的订单,这个讲过了是吧?啊,这是一种方式,那还可以根据谁过滤。是不是还有个cur time字段呀,对吧,我们可以根据cur time,因为咱们那个表是一个什么表,累计行快照时表,是不是里边有各种时间呀,那我们就找,诶cur time等于6月15号的订单,是不是也能把6月15号的所有订单找到,两种方式都能找到,而且结果一样不一样,结果肯定一样,结果肯定一样,那咱们应该用哪种方式呢?肯定用DT呀,对吧,为什么你用DT的话,我直接根据分区字段过滤,是不是直接找到对应路径就可以了,那如果你用cur虑time进行过滤呢,它会怎么做,它肯定会全面扫描的,对不对?那所以说呢,那能以分区作为过滤,尽量以分区作为过滤条件,那其实它这儿呢,想表达的是这个啊意思啊,而不是说什么所有的过滤条件必须加上分析字啊,这个大家应该能理解啊,好,接着往下走。
06:18
下边呢,是关于葛入拜这个语句的这个优化,呃,这个葛入拜呢,指的是什么场景啊,这边呢是,呃,如果说我们进行这个soq分析的时候呢,哎,我们有这种场景,就是你需要可入BY多个字段,咱们之前写SQ是不是也经常有这样的场景啊,对吧?哎按照多个字段分组,那按照多个字段分组的时候呢,你分组字段的排序在这儿是有这个特殊的,哎说明的,那你这个排序怎么排呀?来看这句话。将啊格如BY语句字段中啊,这个按照什么排序啊,按照每个字段的count distinct的值进行降序排序,那其实这个想表达的就是啥,这个抗的金额就是啥,咱们前面讲过一个概念叫什么基数对不对?基数还记得奇数这个概念吧,讲麒麟的时候不是讲过呀啊那也就说你应该按照基数进行降序排序。
07:08
那你就是他这有俩小例子啊。一个是按照谁分组UID加gender u ID是啥是user ID真的是啥是性别啊,真的是性别啊,真是性别,那性别是不是就俩啊,可能有仨是吧,一共就俩,那UID肯定是很多对不对,肯定是很多,那所以这边就是啥。降序降序是不是就是good对吧,那这个是什么,是升序,升序就是BY啊,所以咱们这儿呢,按照它要求,按照降序排序就行了,它有特定的优化,应该是啊啊那再往下走,那下边我们这儿呢,有一个order by啊order by的时候啊,也有一个注意事项,Order by的时候要求我们使用啥。使用limit order by的时候使用limit,诶这个好像说的也有点,这个有点太强硬了,对吧?比如说我现在就想得到一个全局有序的数据集,那我怎么加limit米,我加limit米的结果是不是就不对了呀,对不对,那所以说这个他们怎么理解啊,其实你想一想,我们在做这种需求分析的时候呢,基本上啊,涉及到排序的这个需求,我们肯定是啥呀。
08:11
肯定是套盆或者是包特门啊,我们几乎很少会会有这样的需求,让你去得到一个全局有趣的数据集啊,这样很少,因为没有太多的意义啊,一般我们就看前几看后几就行了,对吧?啊,那所以说那order by的时候呢,我们通常就会伴随着这个厘米的啊,是这样的啊啊,那这边他强调的这个order by时必须用limit,其实他想表达的是什么意思呢?啊,其实想表达的是它这个底层的计算逻辑是不同的,加不加limit order by的时候呢,你这个计算逻辑是不同的。啊,接下来简单说一下这个事儿啊。呃,画个图吧啊,这个应该没啥用了,咱们给它关了啊CTRLC啊,那说一下这个东西啊,那如果说我们使用P的时候呢,如果说你没有加,就是进行排序啊,没有加limit,那它是怎么做的呀。比如说这是你那张大表对不对啊,那你不加limit米啊,你不管中间这个是怎么计算的,但是到最后的时候,我要得到是一个是一个全局的有序,全局有序的一个数据集吧,对不对,那这会怎么做呀?他肯定会把所有的数据最终都写到一个窝坑里边的,对不对,因为你只有在同一台节点,你是不是才能做全局有序的这个排序啊,对不对?那所以说这个worker压力肯定是比较大的,那如果说你加了limit之后呢,比如说我对它进行排序,然后只取前100LIMIT100,那这样会怎么做呀?诶会把这个数据呢,先呃进行拆分,那比如说拆成三部分或几部分,然后每一部分呢,分到一个worker,每个worker只取什么?
09:41
只取自己这一部分数据的前100,然后呢,再把每个前100放到哪,放到最后一个worker里边,是不是得到最终的前100啊,对不对,那这样一来就不会有任意一台,不会有任何一台的这个worker,它的压力比较大,对吧?啊,压力是均摊的,那所以说你加limit和不加limit呢,对它这个底层的支撑逻辑呢,是有影响的啊,所以说呢,我们在这儿呢,就记住这样一个原则,我们用order by的时候呢,一定要带着limit,而且一般情况下,我们这个场景是不是也就是前十或者是后十啊,对吧?哎,前前几或后几,所以这个加厘米的也是应该的啊,那大家把这个记住就行了,好嘞,那下一个。
10:20
还有最后一个啊,最后一个呢是什么?使用join语句时,需要将大表放在前边,小表放在后边。诶,那我们have当中好像也有类似的这个优化嘛,对不对,好像一开始也要求我们什么大表在前脚边在后什么的,对吧,但是现在have是不是已经把这点给它优化掉了呀,对不对,也就是说它会自动的去判断谁大谁小,然后帮你进行优化,这其实主要涉及的是啥呀。Map对不对?主要涉及的是map have当中咱们叫做map对不对啊,还记得map是怎么样的一个原理吗?还记得吗?是不是会把小表缓存在咱们那个内存当中啊,对不对,然后呢,对大表进行便利对不对啊这么去装啊,那其实在price当中呢,也有这个类似于map John的这种算法,只不过在这里边它不叫map John,它叫什么John呢?叫做。
11:12
广播z broadcast。Broadcast它其实就是have当中那个map,其实一个道理啊,那在这里边,它这里边是怎么去做的呢?啊给大家解释一下。假如我现在呢,是大赚小啊。一个大表一个小表对不对,那你要这样的话,应该怎么做。多个worker啊,多个worker,那它底层这个所谓的广播照,其实就等于map,它会怎么做呀,它会把这个小表怎么办分到每个。每个什么里边,每个沃壳里边啊,每个沃壳里边,然后呢会缓存下来,然后呢对大表进行啥。哎,进行相当于进行拆分,哎这一部分,这一部分这一部分,然后呢,每一部分给一个worker,哎,那这样一来的话,是不是每个worker我就能够把自己的这部分数据转到一起,然后给你返回最终的结果了呀,对不对,哎,它是这么多,就是这是广播照那广播站的时候呢,是不是肯定会有一个表会被分发,有一个表会被拆分呀,对吧?那它拆的是谁啊,那分发分的是谁呢?拆的是前边的,哎分发的后边的,那所以这边就要求我们是不是得大表在前,小表在后啊对不对,就记住这个原则就行。
12:21
啊,那如果说我这儿的使用的是大表装大表呢。它是大表上大表怎么办?大表照大表是就不区分前后了呀,对吧,那谁在前谁在后都一样啊,而且这个它底层如果是两个大表的话呢,它也不会再采用broadca John了,它会采用另外一种join算法,叫做哈希照,哈希照怎么是怎么样一个原理呢?其实也很简单啊,这是多个worker对吧,那哈希哈希按照谁哈希啊,你说。是不是会按照这两张表的那个连接条件进行哈希,我用哪个字段进行转,我是不是就按照哪个字段哈希呀,对吧,那这样一来是不是会把召唤到一起的数据哈希到同样的一个节点。
13:01
对不对,那是不是各自就都能照着上来呀?啊是这样的,它是这么去做的啊,那大表照大表这块我们不用关心这个顺序,你就记住大表跟小表照的时候呢,大表在前,小本在后就可以了啊这是这几个思科的注意事项啊,当然在这儿呢,大家呃,这个顺,这个注意事项呢,可能也不大好记啊,你像这东西很容易记混的啊,比如说这个在这儿咱们说的是降序排序啊,对吧,可能一会儿你就记成什么升序了啊对吧,那这个现在说的是大本在前,你可能后一会就忘了,哎,是不是小本在前啊对吧,这东西很难记啊,也不用去记,也不用记啊,就是大家以后知道有这个点就行,以后用的话呢,诶,你翻过来看一看是不是就行了呀,对吧?这个不用死记硬背啊,啊,那这是关于它,那接下来还剩最后一点东西,咱们再坚持一下啊,还有一个注意事项,咱们把这个讲完,那press我们就说完了啊好看注意事项啊,那几个注意事项分别是啥?先看第一个。看这啊,字段名引用啊,这个标题起的也不知道啥意思是吧,咱不用看它了啊,这边主要说的是啥啊,大家回忆一下,我们在have或在买搜狗当中,咱们建表的时候啊,你的表名或者是你的字段名啊,如果说你那个表名恰好就是一个SQ当中的关键字。
14:11
啊,比如说我这个表名叫order表,Order,你就直接order,那这个是建表的时候肯定会报错,对吧,因为啥,因为order是关键字啊,对吧,但是我现在我就想用order作为我的表名。那你怎么去做呀?对,是不是加在那个order,呃,那个上面加一个那个反引号或标号,是不是用来声明一下,我现在不是关键字,我就是一个普通的表明,对吧,是不是就可以了,那price当中啊,也有类似的操作啊,也有类似,只不过呢,我标识的时候呢,不用这个反引号,我用什么呢?用双引号。啊,这有一点区别的啊,这个得记住啊,啊也就是他标出标识这个关键字的时候呢,它用的不是这个这个这个不是用的这个标号,是用的反引,是用的双引号,把这个记住就行了啊啊这是它,那接下来还有一个啊,关于这个时间的这个一个说明,关于时间一个说明啊这个主要说的是什么呢?咱们看下面这个例子就行了。
15:08
看一下这个色。这搜呢,大家应该有有有有这个类似的这个场景啊,这相当于什么,是不是就从一张表里选数据对不对,然后呢,外二物理条件是啥。是不是一个字段,这个T呢?就是我们这个A表当中的一个字段啊,是不是用这个字段,当然这个字段类型的是一个时间字段啊,用这个时间去跟另一个时间去比较,对吧?T大于什么对不对?那咱们在have当中,或者或者在MYSO当中啊,我一个字段去跟一个时间比较的时候,那是不是就直接让这个字段跟一个时间字符串比就行了呀,这是不是就是一个字符串,哎,在have在当中都能直接比较,都能直接比,但是在咱们的press当中你就比不了了。在press,你这样比比不了这个语法它不对啊,你要想在当中写类似的这个操作的话呢,你得怎么做呀,必须得在你这个时间的字符串前边加上一个time step这样的一个关键字。
16:06
啊,用来声明我后边这个字符串呢,是一个时间,你才能进行比较。啊,这块呢,是有一点麻烦的啊,有点麻烦的,这个大家注意就行了啊,就是这块的有一点这个语法的这个不同,把这个就准行了啊,但是在买思在have当中,这个时间字符段能够这个字符段呢,能够直接跟时间字段进行比较,在press当中呢,就不行啊,就不行,再把这个记住好,那现在再往下走。不支持insert or right语法啊,Press是不支持insert or right的啊,那假如我就想实现这个效果怎么做呢?只能先手动删除,再手动的iner的into,只能这么做啊,那当然这个其实也不影响咱们使用啊,为啥呀,咱们使用图字干什么用呢?查询对吧,咱们是集查询嘛,呃,我在have当中,我往表里边导数据那一套操作,咱不是还是用have去做呀,对吧?啊所以说这边呢,不影响咱们使用啊,即便不能插入也无所谓啊,能查就行啊,这是关于它那还有一个。
17:05
关于PA qui的这个列式存储格式啊,这样的一个说明啊,Presso支不支持读取PA qui格式的文件呢?支持,但是只支持读取。啊,不支持插入啊,那当然这个也不影响咱们使用对吧,因为咱们毕竟也是只用它用来查询对吧,我不会让他去导数据的啊是这样的,就是这样的几个注意事项啊。好,那到这儿呢,我们pre就讲完了啊,我把视频录一下。
我来说两句