00:00
好,那接下来呢,我们结合着以前一个项目里的内容去讲那个rookie的一个设计啊,那个项目呢,现在我们已经不讲了,但是里面设计的原则呢,呃,还是可以的啊,我拿出来讲一讲啊,拿来讲讲,因为那个项目呢,已经比较老了,比较老了,呃。之前是有讲过的啊,之前没有讲过的,OK,那我们看一下之前有个什么项目呢,是有一个那个电信的项目,呃,他这样的。是数据,我们实时产生一些这样的数据,就是幺三。112341234,然后给这个,我们是这个数据也是随机造的啊,也是随机造的啊,这个数据是电话号,谁造爷电话号,然后给18998769876打了一通电话。打了一通电话,好,这一通电话在12月啊,这样2018年。12月12日,什么12:12:12 21秒打的打了568秒,就是这个是我们最原始生产的数据,能理解。
01:08
啊,就模拟这个打电话,因为他是做那个电信方面的一个统计啊,电信方面统计,当然这个人可能还在其他那个时候去打的这个电话,好,那你想想看,你在整个那个电信或者移动那个页面上是不是能查到你当月的话单。对吧,首先它有一个这样的东西吧,呃,你当月打了多长时间电话。通话时长,总通话时长,说主教时长,被叫时长,发了多少条短信,流量用了多少,是不是这些汇总方面的一个统计,这个我们可以用member或者have来统计吧,对吧?你可以把这个人电话号以他作为那个分组,然后以他作为什么。去课件啊,如果说你还要看每个月份的话,你是不是把这个时间格式化为月份,然后按他们俩进行分组。按电话号跟这两个进行分组,对吧。
02:04
两个进行分组,然后统计这个时间吧,你是不是可以统计出来哎,当月或者当日总的一个通话时长。对吧?啊是这个意思,那除了有统计的指标之外,我们还有内容,你是不是可以查询当月或者以往连续几个月,或者说两个月三个月等等一个通话详情。能不能查到?但是大家应该很少去惩罚这个事儿,对吧,就是说通过场景是什么意思啊,你这个假如说你这个统计出来一个小时,总共这个月打了一个小时的电话,这一个小时是五分钟。在什么什么时间点跟这个人聊的,在什么什么时间跟那个人聊的,是不是能查询到话单的整个的一个详情啊,在上面可以查到啊,那详情是不是直接把这张数据给他搂出去了。没问题吧,详情吗?这个是详情吗?我们只不过说造数据的时候,没有造那个什么流量啊,短信啊那种数据啊,正常的他电信客服,电信整个的公司或者移动,还有那个联通,它是不是应该会采集这些信息,我们只是采集了这个,相当于因为这个数据是我们模拟造的啊,自己造的,所以只造的这个通话,其实你其他的什么流量啊,这些东西都一样的,你在后面加一个字段对吧?啊等等这些内容,好,那现在问题就在于,我现在就要查话单详情。
03:21
我这个东西数据量,电信整个的一个通话记录来说,数据量特别大。这数据量是特别大的吧,啊,所以用H来存,H来存,那这个时候呢,我们希望呢。要拿到详情,那我们就要想一个问题了。对吧,想个问题了,第一个预分区我们应该设计。对吧,假设我们有,呃。300个分区我先回定一下,因为电信客服的话,它分区会多一点,就是呃,假如说300台机器吧,或者100多台机器,200台机器这样对吧,我们将来呢,呃,预定好了,就是未来数据量也考虑了,将来呢分300个区啊分300个区,那接下来这个rookie整个的一个分区应该怎么设置?
04:15
有同学提到了按手机号前几位来分,首先手机号的前几位能分出来300个区吗?三个需要二件。对吧。你前三位有299吧?没有吧,现在多以一开头的第一位基本上都占定了,是不是其实就两位啊,两位任意组合也才99个吧。100个从零零开始吧,零零到九九,100个那也不够吧,而且电话号当中这个是具有特殊性的。电话号幺三几,什么幺几几这个东西是不是集住集中性啊,所以你不能用这个对吧,这个就搞定了。注意现在聊的是分区号怎么设计啊,不是分区键怎么设计。
05:03
什么叫分区键吗?就是你创建表的时候,将来从哪到哪,放哪个区,从哪到哪吧。这样在生产环境当中一般的用的最多的,因为分区键这个东西如何设计是不是没有什么影响,只要你在最终设计的前面把分区线拼上去就够了,在生产环境当中一般是这样设计的啊,用的最多的一种方式啊,给大家介绍一下,就是我们会设计成000。001竖杠002竖杠一直点点点对吧。然后到什么025,然后呢,我再点点点在152。类似于这样的一个内容,然后一个竖杠。啊,就是分区线设计是这样的,就是你不有300个区吗?对吧,300个区最后我应该是二,哎298是吧。
06:03
从零米开始说。没问题吧,从零零开始的吗?对吧,一到二八这二八个加个肩膀应该是他的内容三个区。方法去这样设计好,好这样设计好,那这个前面大家能不能理解,这个是。因为你上百了,是不是应该有三位数啊,对吧,有三位数好,那最后这个竖杠。输杠干什么用的呢?是这样的,因为我们知道将来啊,我们要在整个rookie的前面。要拼接一个类似这样的内容。对吧,而且我希望他遇到这个东西就能把它拦下来,所以在分区就是rookie。的前面,我们一般会拼接上同一个000下划线啊零零。一下划线,然后一直到这个地方,我把它拿来吧。
07:05
你不是竖杠吗?全部改成什么?下划线。下划线,因为竖杠比下划线大,所以我只要看前三位,Rie的前三位我就知道在哪个分区了。对吧,如果你是000下划线开头的。我不用管你后面存在什么乱七八糟的东西,IE我现在就知道他在哪个城区。第一个分区是负无穷到0.0,那个分区对不对。能理解这个事儿吧?啊,这样设计的一个好处就在于这儿,你只要看前三位就够了,因为你将来是要写大Rose肉的呀。你是不是写start stop啊,对吧,啊start stop,因为你要把这个数据放在一块,好,那现在是这个问题放在这了。啊,放在这了,Rie前面呢,我们要定义成这个样子啊,这个点其实我们之前也都说过,就是说它rie的前面应该拼接上类似于分区线一样的东西吧,这个没问题吧,只不过说现在加了一个竖杠跟一个下划线,而且作用也跟大家解释了,这个应该不难理解吧,就是为了把它拦截下来,你分支线不就是为了。
08:15
把具体的rookie放到不同的分区里面吗?不就是做这个事用的吗?那我用一个非常。阿斯特玛值非常高的一个数化线,数化线应该是最大的,或者是第二大的,它非常大啊,非常大,但是一定比这个下滑线大,一定比这个下滑大啊,所以呢,在生长环境当中,分区键跟rookie的前面一般呢,他们是这样的关系啊,用的特别多,好,那接下来的问题就在于我们要考虑散裂和集中性。那这样我们将来是不是拿一个人的通话详情啊?那你想想看,最好把什么样的东西放在一个分区里。一个是不是我们可以把一个手机号放在一个分区,那手机号这个东西我们怎么跟分区对应,现在想一个我们可以怎么对应。
09:20
就是说手机号,我怎么把它转换成这个东西吧。因为你希望手机号到一个分区,那就等于是同一个手机号前面得到这个值是不是一样的就行了。对吧,有什么办法,这样有个更简单的方法,我直接拿手机号11位数字对吧,我直接跟。九。跟299取五取对吧,取余数是不是就行了。能听懂吗?我直接拿着手机号跟进行取操作,那你得到的是不是到好,那既然你是拿手机号跟299去挪的。
10:09
那只要手机号相同,余数是不是相同。有可能不同的手机。那有有可能不同的手机号进来一个分区,那你不能一个一个人手机号一个分区吧,那肯定是一个分区里面有不同的手机号,这个是可以的,但是我们的目标是同一个手机号进到一个分区,对吧?啊进到一个分区好第二个问题,我们同一个手机号进到一个分区之后,刚才有同学提到由于有不同的手机号进到一个分区,我们是不是希望集中的去读这个数据。所以这个时候可以后面紧接着应该拼什么,是不是先拼手机号啊,因为我希望集中的去读这个手机号,对吧,那你手机号往前提,它最终是不是按位比较,先比较手机号,你手机号相同的是不是放在一块。
11:00
能不能理解这个事对吧,那这后面我假如说拼接一个1311234。1234。啊,写的。131234对吧,无所谓,就这样,就是一个手机号码对吧?啊,2134134无所谓啊,就这个内容这样的。啊,是这样的一个拼接方式,对吧?啊这样一个拼接方式,那这样在一个分区,假如说我们就要这么多位先我们不考虑位数,因为我们要考虑位数的话,我们可以再拼接一个什么时间,对吧,把那个什么12019那个时间再拼上吧,啊把那个时间再拼上去就行了,好现在是这个问题。这个到这块,现在能不能理解这个事儿。对吧,我们刚才从前面分析,首先呢,解决的是预分区的,是你先定下来将来分多少个区,第二部分就是你分区建如何设计生产环境当中更多的采用这种策略。对吧,其实你设计成abcd有影响吗?没影响没影响,对吧,因为你最后拼接前面拼接的有abcd吗?是这意思对吧?就前面生成什么东西,这个更方便的点在于,它可以直接对299进行取模,得到一个数字,如果你用的是abcd。
12:14
假如说你是十个区abcde,一一直到的,你是不是应该搞一个数组?搞一个数组对吧,把这个abcd分对线放进去,然后接下来拿手机号跟十进行取模,然后拿到这个模的值去数组里面取值啊,是不是这种方式也可以吧?啊,这种方式也可以,但是它稍微麻烦一点吧,还不如我们直接用数字来的对。方便一些啊,所以呢,生场环件当中多用于这张啊,当然你前面拼接字符传这也可以abcd啊,这些都无所谓啊,随便拼什么,因为分区线其实怎么设计没有影响啊,没有影响,更重要的是分区线设计好了之后,Rookie怎么设计这个问题。那我们rookie肯定要前面拼接这个内容啊,后面我们要想的。手机号好,我们要集中读手机号,这个是不是我们根据业务解决了集中性的问题,但是大家要注意,不同的人打电话的次数是差距非常大的。
13:11
对吧,你直接把某一个人的多少年的电话都放在一个分区。这样有可能会什么产生数据信息,所以我们希望把这个数据干什么,把同一个人的数据也给他分散到不同的分区里面。那现在我如果想把。同一个人的数据分散到不同的区里边怎么做?就是刚才我们是不是按照手机号模拟299的,现在你不能按手机号补299,应该按什么东西。是不是手机号加上时间。是不是要用这两个东西。那你看啊,你把一个人,这个人的通话记录想要放在不同的分区里边。
14:06
你是不是只能按照时间去放?对吧。啊,你按照时间去放,那我们想的是,那我按一年放,按一个月放还是按一天放呢。按一年放,稍微的还是集中了一点。对吧,按天放是不是最好的。什么?最闪电吗?是不是啊,最省电,但是大家想一个问题,按天放有没有什么问题啊?按天放。如果说我想查一年的通话详情,你要怎么做?三天你超过了这300个分区,你至少要写300个,因为每一个分区里面都可能有你的数据。
15:03
对不对,对吧,是不是太散裂了。它是散裂最好的,是不是有可能我这一个人散裂到300个分区里面,是不是把一个人的数据全部打开了,那更好吧,打的更碎对吧,但是太碎了,你取出去的时候是不好取,你是不是至少要写个才能把这个人前面的通话记录给他拿出来,因为你有300个分区吗?对吧,你是不是每一个分区里面都可能有他的数据。好,最终呢,我们选定了什么?年月按照月啊,按照月份的话,你也不能说直接按照12月,这个是不是年月啊,这两个东西在一块吧,啊按照年月好,按照年月呢,就很简单,那我们可以把手机号对吧,拿过来我加上。年月行不行?对吧,我直接把它干掉,幺二这样2019杠啊,直接杠也不要了,十二十二,我直接加上这个值去模拟299行不行。
16:04
可以吧,但是加法呀,可能不好,那这边呢,你可以随便,至于你只要选定的是这两个数字,至于你中间是加减乘除什么异或与或同货随便了。四方就算了,四方就算了,四方就算了,做这个对吧?啊好,那他是不是得到一个值。对吧,假如说得到一个值,甚至你觉得这个东西还不靠谱,你可以再干什么?哈希,一下得到一个值吧,对这个值进行什么?模拟。299。对吧,啊,取到钥匙好,那不管你怎么做的,只要你做法一致,我同一个人同一个月份打的电话是不是都在一个分局。对吧,啊,都在一个分区是这意思。没问题吧,哎,我多写了一个12对吧,这个是按天的,应该是20912吧,啊到这啊到年月这个内容好,那接下来rookie要改了吧,是首先我要集中读手机号,那接下来我是不是希望这一个月份的数据集中读啊,所以这后面一定要再跟上一个什么2019杠幺二杠。
17:22
幺二,然后把这个时间给他干什么,是不是拼接上去,那这样如果说rie这样设计的,我同一个人同一个月份打个电话,首先在一个分区了,第二他还是在一块嘛。对吧?啊,其实你里面能感觉到一个问题,就是说你想集中读什么数据,你把什么字段往前提。因为让他先进行比较吧,先比较了,如果说相同的这个数据是不是集中在一块,能不能理解这个事。能想明白这个问题吧,好,所以呢,你要是这样做的就OK了,那接下来考虑最后一个问题,好,R,我已经设计好了前面000后面的123那个电话号,再拼接上一个年月日等等这个时间,因为年月日这你拼到这一块是不是可以我再多拼几个,拼到这为了长度原则是不是也可以啊,因为这个东西一样,我是不是就在一块啊?
18:15
后面正好按按天排的嘛,对吧,按有序的好,那接下来我们要想一下问题了,我现在要。这个人。我要拿一下2019年。二月份通话详情。我大应该怎么写?你刚才不是说了放在一个分区,为了将来读好读一点吗?对吧,这个应该怎么写。首先他的应该是这个样子,来我们写一下。前面应该是啊,前面随便就是xxx对吧,Xxx是不是这两个算出来的啊,我反正也不知道对吧,然后在呃什么零二杠幺三啊,类似于这样东西,然后12:12:12打个电话啊,打电话假如说这样那个东西。
19:16
我现在肉怎么能拿到?这个人。二月份所有的同款奖品。怎么写?是不是应该拿着手机号跟2019年二月份算出来这个XX是谁啊,肯定同样的要根据这个算法吧,啊,你怎么放的,是不是应该怎么取,是不是还是根据这个算法自己写这个方法对吧,根据这个来写好,首先确定xxx这个东西是谁,把这个东西写上,然后呢。是不是手机号在呢。是不是把这个东西直接写上作为star?左边右开嘛,对吧,左边右开嘛,记得。
20:01
这个值我左臂的会取到这个值吗?能取到,但是在数据里边有这种值吗?没有二份的数据都比他什么大,因为后面至少有一位吧,啊,至少有一位有比没有。大,所以还有一个问题,它会包裹进来多的数据吗?因为首先它不会丢数据,二月份的数据是不是已经左边被我们全部拿进拦进去了,那你要想一想,会不会包裹进来多的数据,多余的数据呢,你也不能多吧。这个东西会包裹进来多余的数据吗?不会。对吧,你要是三月份或者一月份,假如说恰好算出来值也在这一个分区,那它是不是比它小啊。对吧,啊,他一个不多二份的数据,一个不多,一个不少,那接下来是我们所说的到这个地方,好,有同学提到了这个。
21:04
是不是零三。传进去零三。好,前面这个东西应该怎么写?是将手机号跟2019年三月份算一个什么YYY的值吗?是不是前面写的还是谁啊。还是应该拿着这个手机号跟二月份算的是吧,因为这个东西只是拦截二月份用的,你不要看了这个好像是零三就认为他这个什么。三月份的,其实有个更简单的方法,我stop,可以这样写行不行?因为我说了这个竖划线是要么最大的,或者第二大的,是不是比我这个什么。中杠也要大吧,啊比中杠也要大,是不是能把这个二月份所有的数据都拿进去,因为只要你是二月份的数据,是不是一定比我这个小。对吧,而且他会拦截订单多的数据吗?不会吧,啊,你是一月份三月份数据都进不来啊,都进不来,所以这种我写个书杠是不是更好,更好理解一点。
22:09
对吧,啊,比你写三是不是好理解,因为这写三有同学可能想了,那你这个东西应该前面这个应该跟手机号跟三月份算出来的YYY啊,但是你写成竖杠是不是更好理解一点,其实你写成竖杠能理解,你把它换成三你也能理解了。他其实就简单的起一个拦截的作用,对吧,它跟三月份一点关系都没有啊,一点关系都没有啊,是这个意思啊,那这种情况就搞定了,那有同学说那我要拿一年的数据,拿一年的数据的话,你只需要写12个类似于这样的一个东西就行了,对吧。但如果你按天存,按天存的话,你要是拿一年的数据,你要写多少个类似的这样东西。写300个也不用写365个,因为你有300分区嘛,对吧,你写300个就够了啊,300个拿一年的数据啊,写300个类似的这样东西,但是你果说你想一天一天拿的话,你要写三个。
23:01
因为365个的话,肯定有不同的天数在。同一个里边,那如果说我真的是按天存的,可以写到这吧。一年的数据可以写到年份,这不就行了吗?对吧,你写300个就够了,能理解这个事了啊这个意思啊,就是说最终呢,我们会选定一月份这个内容作为。啊,就是手机号加上月份这个值作为这个内容的,啊,这个内容因为这样的情况下,我们既考虑到它的一个散列性,又考虑读取数据的一个什么。便利性吧,啊,又考虑到读取数据的便利性,因为你将来是要读取数据详情的啊,你要把某一些数据是要集中的去放的啊,所以呢,我们之前所聊的这个地方说你要考虑散电性的同时要考虑那个整个的什么。集中性,你没有业务,你能考虑这个事儿吗?没有实际的业务,你能考虑的了集中性这个问题吗?根本考虑不了吧啊,所以说呢,他在面试过程当中,在任中可以让你设计多与情景题,面试的时候来问你,你要想一想,结合着人家业务,再想一想我们给大家说的这个点去答这个题啊,多以面试题为主,笔试题当中呢,就问一个试题原则啊,就那三个点就知道啊。
我来说两句