00:00
等我看一下啊呃,这个呢,说50万个京东商铺,这个就不用管了,对吧,就说明数据量的问题。他说的,他每个顾客访问任何一个店铺的任何一个商品的时候,都会产生一条什么。访问日志啊,这个是一条日志啊,这个是一条日志,然后访问日志存储的表名叫微列,然后这个访客叫这个你就的ID,然后这个叫少啊少连列啊,这个是我自己造的数据,其实它原题当中没有提供数据啊,所以能看出来,如果说是官方提供数据,应该不是不会是这种啊,反正自己造的啊,我自己造的一些数据。然后呢,我们把这个表给他建立一下。哎,我把这个集胸拍一下。让它开着,开了之后呢,我们来鉴别啊,这边呃,第一个第一个题啊。
01:06
他说每个店铺的一个UV。括号叫访客数。叫访客数,不是说这个店铺被访问的次数,而是来访问这边这个店铺的什么人数,那这里边有什么区别啊,刚才手册在那。因为我们知道对于某一个店铺来说,一个人可以访问什么多次吧,啊访问多次这里边就涉及到一个驱虫的一个点在里边啊,是不是有的同学直接写的select count新啊select什么shop逗号康馨啊from这个表,然后。Go by shop,有人那样写的吗?啊,你要注意啊,这个是访客数。访客数啊,这个叫u u visit啊U啊对吧,注意一下,其实但是我们要说的一个点啊,就是的这个东西啊。它不够优化。
02:00
因为大家想一下,就是这个呢,你们知道怎么驱动吗。嗯,它是怎么去重的,它把这一个,你假如说对内进行去重,它把整个表的name放在一块去做去重。对吧,他这样做的,那在生产环境当中,一般数据量比较大,如果说你用的话,它是会导致这些数据呢,进到一个reducer里面。那会导致R同一个R里面怎么样处理的数据量太大了。处理的数据量太大了,好,那现在我现在不希望它进到同一个video里,我有什么办法?我要驱虫,我不要用。对吧,肯定可以啊,这个写法就是select shop逗号,然后是count。U,待吧U,然后from这个什么visit,然后是grow by这个shop啊,这样写啊,肯定可以,结果是对的。
03:07
但是现在因为我们说了,大家也知道是把全表的这一列的数据都放在一块去做去。这样就会导致,如果说你数据集比较大,会导致什么问题啊。你的整个的reducer这边处理的数据量过大了,那我们想呢,能不能有什么办法把它分开处理?啊格新。进行。不是你说啊哦,你说的是可能对吧,就是把它变成一个数组,那这更完了吗?你放在一个数组里面,接下来那个查出来数据,那都不知道多长对吧。就是你之前学过的当中还有什么方法来可以做驱动吗?Group by吧,啊group啊,就是用group by来代替用分组函数,因为分组函数之后你能保证的是相同的名字进到一个什么。
04:10
方法里边去处理。因为group按照分组了,不同的名字会到一块去处理吗?不会啊,不会,也就是说将我们刚才所说的里边把所有人的名字放在一块进去了,变成了把一个人的名字,一个人的名字去调用名字什么维方法的那种啊,就不要放在一个里面送,但是group这种方式呢,呃,就是我们所说的你一次性能够做到这个需求吗?不行吧,啊不行的,所以呢,要只查询老师,抓紧先去虫再做什么事的。求总数能听懂。先去重再求总数啊,先去重再求总数,那怎么做呢?这样来看一下,这个应该写了,就说往CBOD摸着判对吧?呃,好B好,就第一题本身是很简单,但是呢,这题出在京东或者说呃,在公司当中,你遇到这种面试题的时候,尽量的不要用distinct,就是你们后面写的时候也要注意啊,写的时候注意尽量的用group派来代替啊,多一个子查询,但是呢,因为distinct很有可能会报内存溢出。
05:23
处理不了这个数据,但是你虽然写的子查询效率有可能会低一些,但是呢,它能保证你这什么。执行成功是这个意思能听懂啊好,呃,这个来了,然后呢,我们创建一下这个表啊,把表过来啊,这个叫visit对照表。然后呢,CD。到塔,我上午是不是建了一个VK的这个数据了,对吧。Very京东吧,接地点啊京东问题。然后呢,把我们数据给他拿过来,我们把数据导一下,这个数据我还是同样的倒过来看一眼,因为防止出问题。
06:02
放在这。啊,钢铁没有问题啊,CTRLC给他拿过来放在这里。保存退出啊。好漏的。这样吧,我直接在这改一下,我就不敲这个log了,哎,这没有没有写什么加载数据的语句没写,呃,叫local。啊,这个敲的太多了。Okd Mo,然后贝塔里边有一个接地京东点TT对吧。Into table这个。先来个新放这个。啊,走好,呃,数据能查出来了啊,数据能查出来了,OK,这两个字段我们拿一下。好正常的,按照我们刚才所说的第一题。用的怎么写的?呃,上对吧,啊,我们要查看一个店他访客人数,然后是count。
07:06
DT,然后这个什么UID对吧?啊ID这个呢,我们叫UV啊叫UV啊取个别名,然后from。这个visit的这张表吧,啊from的这张表OK,然后记注意要分组吧。少对吧,啊,这样的话我们就能得到我们那个结果,我把它保一下,把它拔下。当然咱们这个数据量啊,其实你看不出来什么差别啊,可能执行的一个速度呀,或者其他一个内容啊,都差不多啊,如果说数据量大的你就信,很有可能就给你报内存库好不起来啊,很有可能就这样的一个内容。因为他是把所有的数据放在同一个reduce的同一个reduce方法里面去处理的。
08:02
啊,它要放在同一个位六次方法里边,OK,嗯,ABCUV数是这个什么443啊443好,我们刚才说的这种方式呢,在面试过程当中,或者甚至在生产环境当中呢,尽量的不要这样去写了,因为它不够优化,不够优化,呃,那我们换一种写法,就是要用勾来代替啊,勾白来代替,那首先第一步啊,第一步就是做驱虫。第一步,去。去中怎么写select邵要不要得要吧啊然后UID是不是对吧,ID直接写在这,然后是from这个。的这张表吧表,然后怎么就得到了?什么东西?刷,然后呢,逗号是不是还有一个U在B,也就是说我们希望你求的是某一个商店的访客数。
09:03
对吧,你这个访客是不是对于受这个U的ID可能会出现多次,但是我只要一个吧,啊只要一个,所以呢,我go back是不是变成一个。有问题吗?OK吧,那这个呢,就是做到了我们一个驱虫,那我们把它来跑一下啊。这个时候呢,我们就知道,诶,一个商店一个人访问的时候只有一条数据,本来是不可能就存在多条啊,对吧?啊存在多条,我同时按他们俩进行分组,那它只有一条了啊,它只有一条了,好,那接下来这个事情这么简单了。假如说让他跑了啊,接下来第二步就做什么。基数对吧,啊基数。那就来了。Shop还得要吧啊,是某一个商店的一个位数,那第二个就直接count。七。对吧,哎,Count的新啊,或者你抗力也可以,那这个呢,同样的我们把它取名叫UV可以吧,这个就是from哪张表。
10:05
第一啊第一表,然后注意既然一个shop一个count,所以还要有一波叫什么如BY都BY这个少把少啊这样的一个括号,那然后第二个呢,这边加一个括号,把这个东西给他进来了。给它站起来啊,驱虫并奇数。他好像刚才的结果应该是什么样的,ABC43对吧?啊ABC43,其实你现在能看出来A不四个,B4个C3个吧,啊就对这个结果进行看心就够啊看心就够。我们看一下这因速率,但是咱这个数据比较小。这个是。总共耗时多久?20,哎,不是。秒对吧。二十二十左右啊,20左右,其实我说了这个数据集比较小啊,比较小,其实你这个时间呢,看不出来什么内容呢,结果没问题吧,啊结果没问题,43,也就是说你在面试过程当中,或者说生产环境当中,如果说类似的类似这种需求你要用的,你去容的时候要想一下。
11:17
啊,要用去干什么啊,一个优化方案啊,优化方案是这个意思啊。这是我们所说的第一题啊,第一题本身很简单,就是我们要说一下这个优化。把它解向。
我来说两句