00:00
再来聊聊分统的一些事儿啊,一些细节,那分筒我们知道,就是建表语句指定一个distribution by,对不对啊,那玩意儿我们前面都看过了,那么大家注意,分筒它可以是多个列啊,也就是说分筒不一定说只有一个字段,可以是多列啊,但是必须为K列啊,同样的道理跟分区列一样啊,另外呢,分统列跟分区列可以相同,可以不同,也就是说它俩之间。没有很直接的关系啊,没有互相限制啊,另外就是分统列,既然可以多列,那我到底是选择哪些列,是多一点好还是少一点好呢?这个其实是在我们查询的吞吐还有并发之间的一个权衡。那我们具体来看,如果我选择多个分同列,那数据会分布的更均匀更少啊对不对,举一个例子啊,比如说我们呃有这么几个字段,比如说呃呃我我写在这个上面了。
01:07
比如说我有这么几个,有了ID。呃,或者说一个ID,然后一个内,呃,一个学科。然后一个分数。好。那比如说再来一个班级对吧?啊,假设有一张表这么多个字段啊,随便,那我如果只是分筒根据谁,比如说我只根据一个name。或者我只按照学科进行分头,那比如说我学科有三种,我有三个学科啊,语文数学英语那回头。那我磨上三,我把它分成三个桶。那其实每个学科不一样,磨成三个头是不是刚好一个学科一个分筒啊,对吧?但这样还不够少,那如果我的分筒是这样,呃,是班级加学科来分头,那假设我有三个班级。
02:17
那又有三个学科,那么大家可想而知,它可以分成几种组合啊,是不是九种啊?对不对,也就是说我根据两个字段是不是可以分得更散一点,更具体一点,说白了是不是我分的力度更加的细,对吧,那这种就是说我把它分的更散一点,那数据分布呢,可能会更均匀一点,但是你要注意啊,如果一个查询条件不包含分统列的等值条件。那会触发什么?所有分筒同时扫描。对吧。那这样的话,我们吞吐会增加,因为你扫描的数据量多的嘛,你吞吐大家注意吞吐不是说它好啊,你没用的数据,你不要的数据,那也叫吞吐啊,那也是吞吐的一部分。
03:08
那我们对于一个查询我的我们的目的,我们的结果而言,这个效率是不是变低了是吧,那这种方式呢,适合什么?大吞吐低并发啊,就是纯粹的吞吐大的时候。合适,那什么叫没有等级条件了,比如说我分董事、班级,还有学科。但是我。没有完全,比如说没有指定哪个班级哪个学科。对吧,那我举个例子,我只指定了一个班级为A班。啊,就过滤条件,呃,查询的时候语句过滤条件为A班学科,我不指定,那请问。我我们这边假设是有九个tablet,就一个分区里面啊,我们假设就一个分区啊,九个tablet。那你想想我。
04:00
单纯的A班,我是不是还是要对九个分统都去获取到,因为每个分统是不是包含了学科信息啊。对不对啊,那这样还是要全部的分桶文件都要进行扫描的啊,并不能很好的说减少吞吐。好,那如果我们的分筒列只选择一个或很少的。那这个时候就相当于说有一个叫什么点查。仅触发个别分桶的扫描对吧?你我不用说,不会像刚才一样说所有分桶都得扫一遍才能找到你要的数据,那当有多个检查并发时,它可能会有较大概率触发不同的分通扫描,那互相之间相当于说找的更精确更准确的。对吧,那在互相之间影响也小,那你的查询延迟,那就。很好了,举个例子啊,比如说我只按学科进行分头,那我查询时,比如说我有两个语句啊,第一个语句我查询,然后where啊,学科等于啊语文,那第二个查询我where啊,学科等英语,那我们知道这个学科假设只有三个嘛,啊英语。
05:22
好,那也是不考虑分区了,我们就想象成单分区,也就只分筒对吧?那比如说分成了三个桶,比方设语文在这,英语在这,数学在这,由于我分筒列很少,而且我过滤时,呃,就是分筒的等值条件。也就是说能筛选出来吧,啊,咱们说大白话就好了,就我过去条件能直接指定到对应的分统就行了,那比如说你看我查的是语文学科,我我分统字段只有学科,那这个时候他是不是只需要查询这个统。对吧,我假设叫他零号筒,一号桶二号桶,它这个搜口这个查询只需要扫描零号筒。
06:04
就可以了,那对于另外一个查询语句,我是不是查英语的,是不是匹配到了,应该是一号筒,我是不是只需要扫描一号筒,也就一号这个table lat就行了,其他两个不用去扫描数据,对不对?那你看互相之间不影响扫描的数据量也少了,效率就提高了,这是一个取舍啊,取舍。另外分桶数量是没上限的,好吧,啊,这是分桶的咱们一些事啊,那使用复合分区的场景可以这么说,一般大部分场景咱们都会使用复合分区,既分区又分筒,那比如说呃,有几个典型的场景有时间维度。或者带有一些有序值的维度可以作为分区列。对吧,比如说按照日期按天分区,这没问题啊,按月分区也可以对吧。
07:00
那么对于历史数据有删除的需求,比如说我们经常有这么一种指标啊,仅保留或者这么一种需求,保留最近N天的数据,比如说我只保留最近30天的数据,那是不是30天之前的数据没用啊,那你要去删的时候。你想想,如果你是按天分区,是把30天之前的那些分区删掉,是不是就很方便了?所以这个时候我们肯定会做一个分区啊,分筒是肯定会做的,对吧?啊就看分区了,那第三一个就解决数据分区啊,数据倾斜的问题,每个分区可以单独指定分桶数量,大家注意啊,我比如说有三个分区,我每个分区的分桶数量是可以分开指定的。那比如说我们是不是每天的数据量可能是不一样的,可能今天的数据量有一个T,那可能明天数据量只有呃。200G可能后天的数据量可能是冷淡期,可能只有,比如说只有50G啊,差距,你看一个TK50G差距就大了吧,是不是这个业务场景很常见吧,比如说我做活动的时候,是不是数据量会多,当天啊做秒杀活动。
08:16
啊,做促销。等等,还有一些日常的啊。那这个时候你就可以说对这个。大数据量的分区,你给他分统数弄多一点啊,弄多一点,那分筒列呢,建议选择区分度比较大的列啊,你你才能更好的分开嘛,对吧?啊,当然这些都是建议,具体呢还得结合具体场景来讲啊,另外我们聊聊一个多列分区啊,我们现在先没有,也是直接看案例啊,后面我们呃,这些都很简单,呃,认卷分区的时候怎么指定多列呢?你看range指定两个字段,然后这一样的是不是起个名字啊,这是啊名分区名字,然后同样的range是不是let呢,对吧,指定一个上界,那用逗号隔开,两个条件分别呢,对应一个字段。
09:17
能理解吧,啊,这个就指定了一个分区。啊,多字段的分区,那下面这个一样的啊。是不是指定两个。两个字段的上界值对吧?也可以呢,只指定一个字段的值,那另一个字段表示不做限值,表示不做限值,那比如说按照这个啊这个,那我们得到了分区值是什么,我们看一眼啊,那首先是第一个分区这个一天这个啊1000,那它的下界是没限制啊是。最小值好,那它的上界是不是就我们指定的这两个。OK吧,好,第二个分区是不是从上一个分区这两个字段的。
10:06
开始啊,就是上一个分区的上界到当前分区的上界,这个是不是对应它啊。再往后一个,呃,它的起始是上一个分区的上界啊,那它的结束是自己上界是什么呢?2017。0401对吧,只指定这另一个,没指定是什么命的最小值。因为它的默认值填充是什么。最小值。那我们也可以看一下这个案例,比如说我插入的数据,这条数据是这样啊,前面这几个分区,来我们来尝试着看一下。那因为大家可能有疑问呢,我有两个点,我怎么确定我这个到底属于哪个分区呢?注意这句话。
11:04
分区列的值会按照顺序依次比较,哎,就是说先比较第一个字段啊,能区分的那就直接就划分好分区了,第一个字段都一样,划分不出来,我就看第二个字段啊,是这个意思,比如说我插入了一条20170101啊,然后这个ID值是200,那我们看一下啊,第一个字的20170101,我们先比较一下前面这几个分区应该是属于哪个区间啊。是不是应该属于这个区间对吧?啊,因为它的上界是2月1号,ID的上界是1000,当然第二个ID不用去比较,所以它是1000的分区,再看下面一个啊,下面一个这个就比较典型了。大家关注的应该是这种啊,那你看第一个字段是1月1号,那应该属于哪一个,我们只考虑第一个字段是不是应该是一天这个分区啊。
12:00
对吧,因为它日期的上届是2月1号啊。所以这个是不是应该属于1000分区,但是这个时候如果你考虑第二个字段是不是2000呢?2000是不是比它的第二个字段1000还大呀,但是这个字段不会去比较,因为第一个字段已经能够确定它属于哪个分区了。能理解这个意思吧,好,那么看第三条数据。呃,2月1号先看第一个字段嘛,对吧,那跟第一个分区的。1000分区的第一个字段值比较,哎。是不是等于它呀,等于它是不是不属于1000,因为我们说分区是左臂右开,所以它是不是应该属于2000呢。但是呢?你。不能光比较这个吧。第一个字段它跟第一个分区匹配不上,那接下来判断第二一个。第二一个是什么呢。
13:01
是不是100。100是不是小于1000呢?那是不是其实还是能够被它所包含的,大家注意咱们所谓的左闭右开一,如果是多列分区,必须是什么时候才是开啊?是所有的分区字段都超了这个范围才表示不属于啊。也就是说你你在比较的时候,第一个比较完,接下来比较第二个,那我们再来看一个例子啊,再来看一个例子。第三条数据啊,啊不,第四条数据是这个,你看日期是2月1号,跟第一个分区比。是不是碰到他的上界啊,不属于对吧,但是我们说别着急,看一下第二个字段,第二个字段是什么呢?2000 2000有没有超过它的上界呢?超过了对不对啊,所以它就不属于这这个时候你才能认定这条数据不属于这个分区的,接下来你看判断第二个分区,先看第一开始。
14:04
诶,在哪啊,这。是符合呀。对吧,是包含在里面,好第一列匹配上了那第二列。2000其实是不是已经超过上届了,但是我们说是不是优先按照顺序比较第一个字段满足就OK了嘛。对吧,而且呢。那有的同学说,那我这一条为什么不直接跟他匹配上呢?只有上我们注意这个顺序,除了列的顺序之外,还有分区之间的顺序,只有小的分区也就1000,匹配完了才会去匹配2000啊,并不会直接命中啊,这是有顺序在里面的,那我们接着看,呃,这个2月15号,那你看跟第一个分区比较,是不是比它大,第二个值5000比它大,不属于它好,第二二月15号是不是落在这个区间。
15:02
对吧,所以那这个时候就不用再接着比较了,第二个字段就不比较了啊,直接就是2000这个分区了,现在能理解吧啊,从小的分区比到大的分区。并且呢,每个分区都是从第一个字段比到最后一个字段啊,再来看3月1号。呃,一样的。判断超过他了2000,超过他了再来。判断他的上届来3月1号。超过它了,再判断第二个值五两千是不是也超过它了啊,所以这条数据肯定不属于1000和2000这个分区。对吧,所以他只能录入哪里啊。再往下看,3月1号。跟第三个分区,这个二分区。第一个字段满足啊,在范围内好,那它就属于二这个分区好再往下,呃,3月10号一啊,这个过程我就省略了啊,你直接判断。
16:07
这个已经超过他了,第一个字段超过他了,对吧。已经超过它,而且呢,它不是临界值了啊,只有临界值的时候,你才会去比较第二个值对不对啊,3月10号肯定不是临界值,所以这个直接就跳过,那再看第二个分区,3月1号跟3月10号。是不是也是超过临界值了?对吧。如果这个是3月1号,那这个可能就可能就落在二两千这个分区了,但他3月10号不在临界值啊,不是,那再往下这个字段是不是满足他呀。对吧。好,那第二个字段不用比较啊,直接就是二分区啊。再往后4月1号一样的超临界值,超临界值好最后一个分区,它的上界是4月1号是不是。
17:02
刚好在临界值啊,接下来判断第二个字段一天,那我们说默认它是第二个字段,这边没写默认是最小值,那1000是不是比它还大呀,超了对吧?啊超了,所以它不属于任何分区,而且无法导入,为什么无法导入,因为没有分区能满足它啊,那后面一样的道理,好吧,那我相信通过这个例子大家应该对它有一个进一步理解,我们总结一下啊,当我们使用多列分区认卷的时候啊,先判断第一个字段的范围满不满足。啊,先从小的分区开始比较啊,那如果第一个字段满足,那直接就落到这个分区,如果第一个字段达到了上界值,接下来比较第二个字段啊,那如果第二个字段也是临界值,那比如说你有三个字段,那接再接下来比较第三个字段,那如果不是临界值,而是已经超了临界值,那直接就判断往下一个分区判断是这样子。
18:06
好,那我们看一下历史的分区,这个比较简单的啊,比如说IDC啊,这两个字段,呃,那我们定义是这样啊,一个ID值一个城市名啊。好,那我们最终确定的分区是这样子啊,一号分区呢。是这两个,二号分区是这两个,三号分区是这几个,好,那我们搞数据一北京。一样的原则,一样多列分区啊,从小到大,从左到右啊,那你看一。呃,满足,看一下北京。这边是匹配了,就没有什么临界不临界了,因为是枚举对吧,第一个字段一好匹配上二诶北京好匹配上,属于P1啊,再看一上海是不是匹配上了。必须每个都匹配上才行啊,每一个都匹配上才行啊,所以P1好二上海。
19:03
你看二的在这里,上海在这好匹配上三北京,诶匹配上了,一模一样啊好一。天津有吗?没有这个组合,不好意思没有四北京不好意思没有对吧?这就是枚举,这就是历史的分区啊,历史的分区好理解。
我来说两句