00:01
好,呃,那接下来我们看啊,现在咱们pre呢,还有这样的三节,1.31.41.5,这分别是什么啊,咱们可以总结一下,其实这也就是我们使用pre的时候呢,我们去写circle,或者我们去建表,诶,我们需要需要去注意的一些事项啊,其实主要是一些注意事项,那我们来逐一的看一下,先看一下这个1.3这一节。呃,1.3这一节呢,就是说这个press优化之数据存储,数据存储那同学可能会比较差异了啊,那press我们前面讲过,你不是就是一个查询引擎吗?对不对,光计算是不负责存储的,那这边所谓的数据存储其实指的是什么?指的是咱们的have啊,指的是have表。号表,就是说如果说诶咱们这个书仓当中,我有一些表,后期我要交给pre去做这种机器查询,对不对,那咱们这些这些表我应该怎么去建呢,对不对,就是说这是咱们还有当中建表的时候大家要注意的一些事项,呃,有什么事项呢?第一点就是合理的设置分区,合理设置分区这是什么意思呢?呃,其实我们press呢,它对接have的时候,是不是对接的是它的原数据,那它从原数据当中呢,也能读取出来这个分区的信息。
01:10
对不对啊,那如果说你合理的设置分区,那后期我们这个数据交给press去查的时候,那我就是说能用分区进行这个过滤数据,那我尽量用分区去过滤数据,那这样一来是不是能够去诶加快咱们这个这个呃SQ的查查询速度啊,为什么,因为我们用分区去过滤这个数据呢?是效率是最高的,因为咱们还有当中分区是真正的物理分区,对不对,诶不同分区的数据我是存在不同的文件当中的,在不同的路径里,那这是这块啊,就是咱们需要去正常去分区,那这边这个东西其实也不用,也不用怎么说,咱们还有当中我本身就是以天分区的,对不对,那所以说我后期我去查数据的时候呢,一般也就是说,诶,比如说查当天的,或者查最近多少天的对不对,也基本上就是这些东西。所以说咱们这个分区呢,就是正常正常分就行,还有常正常分就行,这个不用多说,那接下来这俩是我们需要额外注意的啊,就是说咱们诶需要用pre去查的那些表,我们的列存储以及我们的压缩格式,我们最好选用什么呢?最好选用orc加s snapy这种组合,就是列存储采用orc,然后这个压缩格式呢,采用snap。
02:19
这是咱们需要注意的点。这是咱们需要注意的点啊好,那这边为什么呢?我们先看一下这个列存储,这边是因为这个pre呢,它单独对这个orc进行了这个优化,单独对他进行了优化,也就是你使用orc的时候,我我这个查的时候呢,这个效率是比较高的,比较高的啊,那所以说咱们这个对于这个将要交给pre去查询的表呢,咱们最好用orc。最好用RCR好,那趴会它能不能用,趴也能用,也能用,只不过它没有做特定的优化,好那接下来这个压缩啊,压缩呢,咱们就记住咱们集时查询,集时查询要求什么,要求就是快对不对,那咱们压缩这边谁是最快的呀,谁最快的,那是不是肯定是S内皮是最快的呀,对不对,它解压快,压缩也快,那所以说这边呢,我们采用s snap皮。
03:09
Snap啊好,那这个咱们简单的了解一下就行,把这个记住就行,Orc加snap,这是我们pres最喜欢的这个组合,好那接下来呢是呃,咱们写使用press去写circle的时候,我们一些这个需要去注意的一些事项。需要注意的一些事项啊,这个跟have当中呢,可能有些地方不太一样,我们需要去看一看,首先第一个呃就是说只选这个呃,只选择使用的字段,呃其实说白了就是尽量避免select,那这个我不用多说了吧,因为咱们这个通常进行这种呃及时查询或者是多维分析的时候呢,我们通常呃是不是就是只查某几个字段啊。对不对,那也就是说你需要哪个字段就查哪个字段,不要来听这个,其实没什么可说的,然后往下走。下边的是这个过滤条件,那这个过滤条件呢?呃,我们这块大家要注意它说什么过滤条件必须加上分区字段。
04:03
这个其实呃,这么说不太合适啊,不太合适就是什么时候,这个应该怎么说呢?就是说我们去查数据的时候啊,就是说我们能用分区进行过滤,那一定要用分区进行过滤。能用分区进行过滤,一定要用分区进行过滤啊,把这个记住还记住啊,那大家来可以想一下,我们有可能有一个这样的场景啊,大家来回忆一下咱们那个数仓当中的那个订单实时表。就是DWD。回忆一下这张表啊,那这张表有什么特点,这张表咱分区是用什么分区的,是不是用创建时间分区的,用cur分区的对不对?那这个表里边还有一个字段,这个表里是不是有好几个时间对吧?有什么创建时间,支付时间对吧?那里边是不是也有一个创建时间对吧?那我假如说我要想把某一天的这个分那个订单给它过滤出来,那你说应该用谁去过滤?那你用这个分区字段去过滤,能不能过滤出来,肯定能,那你用那个cur time字段能不能过滤,肯定也能过滤出来,但是这俩效率是不一样的,你要用分区过滤呢?那我这个have直接就是去找咱们这个对应的分区的路径了,那你要用cur time去过滤呢?那会干什么?会全表扫描再过滤。
05:17
所以说这块呢,大家要要知道,就是说我们原则就是说能用分区过滤,一定要用分区去过滤,把这个记住,把这个记住啊,那这就是咱们这个所谓的分区,那而不是说什么必过过滤条件必须加上分区资源,这个你的业务上要没有这个分区,没有这个分,没有这个要求,那你必须加分区,那有什么意义呢?对不对,诶就是说能用就用,诶实在用不上,那那没办法了,对吧?好,那这个玩意之后呢,往下看。下面呢,有一个葛如拜葛如拜这样的一个这个语句语句优化,那我们来看这个,这是什么东西啊,这是什么东西,来看一下。呃,合理安排外语句呢,对这个呃,性能有一定的提升,怎么去安排?他这的要求是让我们将group by这个后边的这个字段啊,这个字段按照什么顺序去排呢?按照这个字段的distinct的数据多少进行降序排列,其实说白了就是什么,就是我格入外,我可能后边呢会接多个字段,就是按照多个维度进行分组嘛。
06:18
哎,多维分析,我们按照多个维度进行分组,那分组的时候,那这几个字段顺序,诶怎么去安排呢?按照这个所谓的这个distinct的数据的多少进行降序排列,其实这个说的就是咱那个维度的基数的概念吧,对不对?在这呢,要求我们按照基数的诶降序排序,降序排序它这有一个例子啊,你看你看那这边呢,有一个UID,有一个真的UID是什么UID呢?是不是这个用户ID真的是性别,那很显然UID的基数要比真的的基数大,对不对,那所以说把这个基数大的放在前边,基数小的放在后边。诶是这块的啊,把它记住就行了,好,那看完之后呢,看下边,下边呢还有一个原则就是使用order by的时候一定要用limit。这个呢,呃,其实这个就是不说大家应该也知道啊,那我给大家说一下,就是为什么咱们这一定要强调一下,为什么这个使用order的时候一定要加limit,给大家强调下这个东西啊,这是为什么,其实你想一想。
07:14
呃,首先咱们现在先不考虑业务需求,先不考虑业务啊,咱们就单纯的说这个它的计算逻辑,咱们就单纯说计算逻辑啊,那如果说我们使用了一个order,而没有加limit。就是单纯的往这摆,那最终给你返回结果应该是什么,是不是应该是从头到尾这样的一个全局有序的这样的一个数据集啊,全局有序的对不对,那你想一想,我如果说我要想得到一个全局有序的数据集,怎么样才能得到?你是不是势必要把所有的数据都给它扔到一个节点上面,我才能得到一个全局的有序啊?对不对。对不对,因为你跨节点,你没有办法进行全局有序嘛,对吧,所以说这样如果说你只有order by没有利的话呢,那他肯定会将所有数据最终放到一个节点里,那这样会导致单个节点它的这个压力过大,压力过大。
08:07
然后这时候我们加上limit,加上limit之后它效果就不一样了,为什么不一样了,你想一想啊,呃,如果说我这有大量的数据,然后呢,我给它加limit了,那这样一来我可以怎么做,我可以把这个数据呢给它分开,分开分成几部分,然后呢,每一部分我先给一个worker。这个worker拿一部分,这拿一部分,这拿一部分,然后比如说我这是LIMIT100,那这时候呢,他就会把自己这部分数据的前100找到,他也找前100,他也找前100,那完事之后呢,每个人都把自己的前100给最后那个worker,那worker当中呢,再从这300当中拿到前100。那最终的结果是不是也是咱们的TOP100呀?对不对,那首先这样一来的话,就不会出现咱们那个就是单个worker压力过大的现象,是不会出现这个现象的,这也就是你加limit和不加limit这个最终执行的这个效果,这个逻辑它是不一样的,是这样的啊然后呢,大家接下来呢,我们去考虑一个什么东西呢,我们去考虑一个。
09:06
呃,考虑什么东西呢?咱们去考虑一个这个业务,考虑业务,那其实我们通常情况下,咱们去使用order by的时候,一般都是求什么。一般的求,一般都是求top n或者是求包门,其实我们更多的时候就是只关注前多少或者是倒数多少。对不对,那所以说首先在业务上我们是不是也应一般情况下也是应该加这个limit的呀,也是应该加limit的,那所以说这边大家就记住这个原则就行,就是说我们使用order by,诶加不加limit,底层计算逻辑它是不一样的,诶所以说我们就是记住这个原则,加order by呢,诶一定要加limit,而且加limit呢,诶其实也不会影响我的逻辑,我们通常就是求top文或者包特门,只有这时候才会培训,对吧,我们没有谁无聊的,比如说要把咱们这个每个用户他这个什么什么东西啊,从头到尾全做一个大排序,这没有意义啊,对不对,OK,那这个东西咱们简单了解一下。
10:04
呃,Map里边的排序的优化,诶对,其实就是这样啊,基本上这些大数据的计算呢,它这个优化的逻辑基本上都是一样的,诶可能具体的实现不一样,但是逻辑都这么个逻辑,好,那现在呢,呃,我们往下看。往下看,下边呢,还有一个这个什么使用转语语句的时候,将大表放起在左边,小表放在这个右边,呃,那这个是怎么回事呢?这个就是我需要给大家先说一下啊,咱们这个pre,这个pre什么东西呢?Pre啊,它的这个这个join语法。需要给大家说一下pro的这个join语法,呃,照照照照那个算法,Join算法啊算法,那他join算法有什么呢?Join算法有俩,一个是咱们这提到的这个,呃,广播join broadcast join,还有一个呢,是咱们这边的一个这样的叫做哈希join的一个算法。一个哈希,那这两种算法分别去处理什么样的情景呢?Broad broadcast呢,可以处理这个小表跟大表的。
11:04
那这个哈希join呢,它处理的是大表跟大表的join是这样的啊,那我们逐一的来分析一下,我们先说这个广播broadcast join,这个叫广播的意思啊,广播join好,那广播的时候他是怎么做的,他这么做。比如说我这边呢,是一个大表。我这边是一个大表,那这边呢,我是一个这样的一个小表,嗯,我是这样的一个小表,对不对,那大表照小表的时候,我们采用的是广播照,那所谓的广播指的是谁?所谓的广播指的什么?所谓的广播呀,是指的是OK,我这边呢,是我最终执行这个任务的worker。这是worker啊。Worker所有的广播照呢,是把谁广播,是把这个小表给他广播了,小表给这个worker发一份这个一份这个一份整张表都给他啊都给他,然后呢,咱们这边呢,把谁把咱们这个诶大表呢给它切了。给它切了,切成几份?清理一份,那这一份给这个worker,那这一份呢,给这个worker,这一份给这worker对吧,那这样一来,我这一部分数据是不是肯定能从这个表里边找到跟他进行join的那部分数据啊,那OK,就join上了,那这边同理同理都进行join,这是咱们这个所谓的广播join,也就把小表广播,然后大表切分。
12:20
那这个它广播的时候,也就是他,诶广播的时候,广播的是谁呢?他广播的是咱们右边这张表,然后切的谁切的是左边这张表,那所以说这时候呢,就要求我们诶将大表放在这个左边,小表放在这个右边,这至它这个所谓的广播照,广播照好,那这个完了之后呢,我们再来看,诶下一种这个转唤方式就是这个呃,哈希照,哈希照应对的场景是这个大表转大表。对吧,大表到那边,那大本那边怎么去,怎么去进行这个join呢,同样是我有多个worker。多个worker啊,多个worker呢怎么办?这两张表,把这两张表的数据呢,按照相同的这个哈希逻辑进行这个呃,给他进行哈希怎么做啊,就是说比如说这张表跟这张表我的join join字段,比如说是这个什么什么ID,这个什么什么ID,那OK,那就按照你的join连接条件进行哈希连哈希,那这样一来会把什么,是不是会把相同的那个,诶join字段的那个数据是不是得给它分到一个里边去了呀。
13:21
因为是按照那个join唤字段哈希的嘛,那相同也就是能join到一起的数据,我是不是会给它分到一个worker里,那分到这儿,那进行join,那其他的呢,诶分到这,诶进行召进行照,诶是这么去分的,这是哈希照,应对的是这种大表照你大表的这种场景,那如果是大大表照你大表,实际上这边呢,你就没有必要去讨论谁在前谁在后了,是这样的,那也就说如果说大表小表,那大家记住把大表在前,小表在后就行了。这是这边啊,这边好,那这个东西就是咱们使用SQ的时候呢,大家要注意的一些事项,然后大家要注意啊,就是这些所有的东西呢,呃,没有必要去背诵啊,没有必要去背,其其实像这些东西很容易很容易记混的啊,你比如说这个格鲁班语句,咱们说的是什么,说的是这个降序,那很有可能你这个记本就记成声序了,对不对,那比如说这个照呢,你说大表在前,小本在后,你看的时候能想起来,可能过一会就忘了,诶到底是大表在前还是小本在前,可能你就忘了,这东西没有必要去背啊,就说呃,大家以后这个呃用的时候呢,你再回头,回过头来你再去看一看就行。
14:21
没有必要去背它那个浪费时间没用啊好,这是咱们这边这个写S的一些简单的注意事项,好那完了之后呢,下边还有一点这个注意事项,这几个注意事项呢,其实就是咱们这个语法上的东西了。就是的语法。跟我们熟悉的这个have或者是MYSQ的语法可能有一些区别。我们先看第一个。第一个是这个字段名的引用,大家都知道我们在have或者在买搜狗当中,我们去呃建表或者去查数据的时候,如果说某一个字段,某一个字段,你那个字段名啊,或者你的表名你是什么,你是S课当中的关键字。比如说我用一个select作为一个字段了,对不对,那这个如果是这样的话,那你需要怎么样,你需要加反引号给这个字段名啊,加反引号,然后是不是用来区分它这个字段名啊,哎,我声明这是一个字段名,我是一个字段,我是一个这个呃字段名,而不是一个关键字,是这样的,需要加反引号,那在这个press当中呢,我们加的不是反引号。
15:19
同样的情况,它加的不是反号,它加的是诶双引号加的双引号啊这块呢,是大家要注意的一个地方,好,那它完之后呢,下边有一个这个,呃,时间函数,有一个时间函数,那时间函数呢,在price当中呢,我们也有也有一些要注意的地方,比如说什么地方看这这有一个这个,呃,咱们那个在have当中也好,在MYSQL当中也好,其实我们那个时间。你去比较一个时间的时候,是完全是按照什么去比较的,是完全就按照那个字符串的比较规则去比的呀,对吧,你就可以把谁直接把那个时间当成一个字符串,就直接去比就可以了,但是呢,在press当中呢不行。它识别不了得怎么办?得给那个时间戳得,或者是这种年月日也好,或者是那个就是step,就是那个秒或者是毫秒数,诶那个也好,你需要在它前面呢,加一个这个time step这样的一个关键字,这样他才能进按照这个时间进行比较。
16:13
是这样的啊,所以这块呢,大家也要注意一下,也要注意一下啊,这是我们这个语法上的一些小区别,然后再往下呢,还有一点,还有一点看这呃press当中呢,是不支持insert over right语法的,只能要想实现这样的操作,只能先delete,然后再insert into,只能这么去做,然后这块呢,其实大家呃呃也能也应该也能想明白啊呃,想明白什么东西呢?你想一想这边是说什么press不支持插入,呃,Allright就是这种呃复写插入的这种方式对不对,那其实这个我们也能理解为什么啊,你想一想是干什么用的。它是查询引擎啊,对不对,是分析引擎,也就说我更多的我使用的是干什么,我是我是查询数据对不对,我不是让他去给他给我导数据去了对不对,那我们这个往表里边去漏的数据啊,去隐erl的数据,我们这都是谁干的活,是我们数仓当中对不对,咱们have这边我定时诶每天去跑的东西。
17:09
这这不是pre干的事,我pre干什么是及其查询引擎,我是主要负责查询的,插入的事呢,我这个支持的不完善也没事,对不对,本身我就不干这个,其实这个也也也也说得过去,也说得过去啊好,这是这点,那下边呢,还有一个这个对于pack这种列存储格式它的一个点,那么呢,Preal只支持查询presal不支持insert。就只能读这样的文件,不能写,其实那这个我们其实跟刚才道理是一样的,对不对,我们press干什么的,我们还是是不是以查询为主啊,诶我是以查询为主,我主要是读,所以说我写不了也能理解,也能理解啊好,那这就是咱们这边press的这个全部内容,好我把视频录一下啊。
我来说两句