00:00
刚才我们已经把咱们的这个需求啊,做了一部分出来了啊呃,之所以说做一部分呢,是因为我们的地区商品名称和点击次数呢,其实都已经出来了啊,而且也满足了我们的这些要求,但是关键点来了,城市备注,咱们这里并没有去完成。那为什么没有完成呢?是因为里面涉及到的东西啊,有点复杂,为什么这么说呢?呃,因为啊,它里面不仅仅是对于我们的某一个区域当中的某个商品来做统计,它要对城市呢,还要做统计啊,而且还有个百分比,那就意味着我们的百分比的话,你得知道总共的点击次数,就意味着这个点击次数你得想办法得到,对吧?这第一点,第二点你还得知道我们的某个商品在某个城市被点击了多少,这样的话求得它的一个比例,对吗?所以啊,咱们是这样的一种情况,那么这种情况对于我们大家来讲的话,我觉得其实相对来说什么呢?诶还是比较简单的,为什么?因为就是求一个北京啊,他点了这个商品,点了多少虾,以及这个商品总共点了多少下,然后呢,求个比率啊,所以说呢,这个城市备注它有个聚合的功能,这个聚合呢是要求得某个城市点击的数量,第二个是我们的总共的点击数量,然后获取它的一个比率,当然还有天津了,对吧?所以这个靠单一的数据是做不到的,但是呢,我们又没有现成的这种聚合的功能来实现它,你像这个点击次数那个count就能做到,你要平均值的话,那个avg就能做到,但是你要想做这样的功能又是聚合,但是呢,又没有现成的方法怎么办?那这时候我们就得自定义u daf了,对吧,同学们。
01:43
所以啊,我们通过简单的分析发现呢,这个地方我们需要自己来实现它的聚合功能,所以啊,我们这里呢,一块儿来看一看,同学们来,首先我们把这个呢给它来拷贝一个新的,因为之前呢,咱们完成了一部分的功能,现在咱们要把它整体给它完成了,所以来点击OK啊来放过来放过来以后啊,咱们这就不要这么写了,其实这么写没有问题啊,这么写是对的,但是啊你会感觉啊它有点乱,为什么呢?有大量的这种指表操作,所以会感觉啊有点乱,所以呢,咱们把它稍微的整理一下好不好,同学们来,咱们首先第一个啊来咱们叫Spark,或者说我们加上注释吧,嗯,咱们叫查询,我们的什么叫基本数据,就是把咱们那些基本数据呢,给它查出来,所以我们的点啊circle,然后呢,在这里呢,给它来,我们把这里面的这一层啊,咱们可以我们直接拿这个吧,咱们之前不写了这个东西嘛,所以咱们直接拷贝把这个呢,我们放过来,放过来以后同学们看我就直接放这。
02:43
这了啊,咱们直接放这儿了,嗯。呃,这个地方我觉得看看咱们在这儿来给它稍微的哎,离别太远了啊,放到这边来好了,那这里我们大家可以看到基本上就差不多了啊差不多了,那么我们这是我们的它,然后呢,我们干嘛呢?点我们叫create,有个叫all replace time view,给他一个T,一把我们这个查询结果呢,就是最基本的数据呢,给它查询出来,哎有一张临时表叫T,然后呢,接下来Spark点我们的这个叫做circle,然后再来我们写上它啊好,在这里我们想干嘛呢?我们就要根据我们的区域啊,咱们的这个商品名称啊,进行分组聚合了,嗯,根据我们的这个商,根据我的区域,咱们叫区域还有商品啊,我们叫进行我们数据的聚合,哎,有这个操作,这个操作呀,其实啊,就是把咱们这个T1拿过来,这个括号题就可以不要对不对,哎,把它去掉,去掉以后,那么就原封不动拷贝过来就可以啊,所以。
03:46
放过来,那么放过来以后有一个问题啊,有一个什么问题呢?就是我们现在可能啊,除了这个,呃,这几个数量以外,还要取得一个备注,那么这个备注啊,我先写上啊,咱们先写上,咱们的目的很简单,就是把城市的一些备注信息拿过来,所以我们起个名叫city remark,咱们前面讲了,我们是要做一个u daf的函数来实现这个聚合功能,所以我们的CT remark我们就定为我们的那个函数,好吧,那么在这里呢,我们就需要一个叫spark.udf点我们叫做register啊来,嗯呃,把这放过来,放过来以后我们就给它起个名叫做city remark,诶,咱们这么写就行了啊,好,然后写个逗号,后面要加点东西,这个咱们后面再补充啊,然后这个remark他想取得什么东西,他其实就想取得咱们的这个地方的city name。所以贝。
04:44
然后呢,给它来个名称,我们叫city,咱们的remark,诶,城市的备注好吧,行了,那这个呢,我们点一下,咱们叫做create啊,咱们的create啊,Temp view,我们叫TR,那么第二张表就有了啊,前面呢,是我们的第一张表,这是我们的第二张表,那么好,有了第二张表以后干嘛呢?我们要在我们的相同区域当中对我们的数量,点击数量进行排行啊呃,我们叫分区内,咱们叫做什么呢?叫区域内吧,区域内对我们的点击啊数量进行我们的排行。
05:21
啊,进行排行,这个排行呢,其实啊都是现成的了,所以Spark点我们的circle,然后呢,在这里呢,给它放过来,放过来以后,那这个地方呢,我们它就不要了啊,咱们这里其实就是一个T2,所以我们拷贝,拷贝之后放过来放到这里啊,然后呢,把这个去掉,嗯。好了,那我相信啊,这边写完以后基本上就差不多了啊,就差不多了,嗯,OK,然后呢,再来我们写上点我们叫做create啊我们的T3,嗯,好,那接下来我们写上Spark,点我们的circle,嗯,再来,那么这里不说了,对吧,就取前三名啊,我们叫取咱们叫前三名啊前三名好了,那这个写完以后,那我们想想啊,就把这个拿过来了呗,这个就不要了呗,对吧,就不要了,然后所以把这个我们拷贝。
06:11
呃,拷贝以后,那么放到这里其实就够了,嗯,好,那么把这个呢,稍微的给它空个行,嗯,行了,那这么写完以后,其实我们的数据就应该取出来了,所以点一下点我们叫做展示一下啊,然后呢,这个展示啊,有一个问题,为什么呢?因为咱们那个备注啊,它有点太长了,它太长的情况下,有的时候啊,默认情况下是看不到的,所以我们这里呢,有一个截取的问题,它会把咱们多余的内容呢,给它用点点点来表示,就是说我们在展示数据的时候呢,它会有一个点点点,它为了让它简单,但是我们来讲的话,我们想看到完整的信息,所以这边大家看一下有个提示,这个提示当中会有一个这个东西check啊,就给它截取掉,那我们就不让它截取掉,所以我们给它一个force啊,给他一个force就行了啊,然后下面这个呢,咱们就不要了啊,把这个咱们全去掉就可以了,好,那我现在大家可以看到,我现在呢,已经把咱们之前的这个circle呢,拆成了几张临时表这样的话。
07:11
理解起来啊,用起来也更加的方便,对吧,比方这我们只需要在我们这个位置添加一个我们的方法就完事了啊,那么叫city remark,在这又叫city remark,那剩下的就是要添加自定义的聚合函数了,来吧,我们这里写上啊,咱们来嗯,叫class,咱们的目的很简单,就叫c remark,嗯,OK,我们叫u daf,好,那我们写上啊来,咱们叫自定义啊,咱们叫自定义咱们的聚合,咱们叫做嗯聚合函数吧,嗯,函数,然后实现咱们叫城市的一个备注功能,嗯,好,那这个功能我说了,你随便写个类是不行的,对不对,你随便写个类的话,那么肯定是识别不了的,所以我们这里来,咱们一咱们要继承啊,咱们要继承,继承呢,有一个叫aggre啊,咱们的ator啊,有这么一个aggregator,你得去继承一下,所以呢,来我们继承叫aggregator啊嗯。
08:11
好,然后呢,在这里呢,我们来把它写上,然后加上我们的来写上定义,咱们叫定义泛型,这个定义泛型呢,它有一个in啊,这个咱们说过了,然后呢,有一个叫做buff,嗯,Buff还有一个咱们叫做out,嗯,这个咱们讲过,In表述的是像我们的聚合函数里面传的是什么东西,那你想想吧,咱们传的不就是我们的城市的名称吗?所以呢,应该是什么呢?咱们叫城市咱们的名称,对吧?那肯定是个字符串啊,这还说啥呢?所以我们这里写上一个string,嗯,OK,然后呢,我们out,那么out大家会发现我们返回的就是个字符串啊,对不对?那所以对于我们来讲,你返回的就应该是个字误串,所以我们这栏写上啊,咱们叫做备注信息,咱们叫备注信息,那其实就是个字符串没问题啊,那么中间是一个我们的buff,那这个buff我们应该写什么呢?对不对,它里面包含什么东西呢?首先第一个啊,你要想做一个比率。
09:11
的话,你得包含什么呢?我们的一个总和对不对?所以啊,我们叫做总的,嗯,来写上咱们加个中国号吧,表示的是一个嗯,多个的意思啊,咱们叫总啊,嗯,咱们叫总的点击数量对不对,还还有这个东西,但是问题来了,你光总的点击数量可能还不够,为什么呢?因为我们还得有的有每个城市的点击数量,这就类似于world count感觉对不对,咱们叫city,有个叫count,然后再来一个我们的city,再来一个count,所以啊,你会发现它的感觉就跟那个键词对一样,跟那个word count一样,那么多个world count的话,不就应该形成一种map的感觉吗?对不对,诶,咱们应该是这个样子啊,所以呢,这个是我们总共的点击数量,这个应该是我们的某个城市它的点击数量,由于有多个城市,而且我们应该形成一种map的这种结构会更好一些,找起来方便嘛,对不对,诶老师,我用个历史的行不行也可以,但是呢,你在更新每每某个城市的数量。
10:11
时候啊,它有可能会是什么呢?诶比较慢,所以呢,咱们用map的方式会更好一些啊好,所以呢,我们的这个buff呀,应该体现这个概念,但是啊,我这里并没有,所以怎么办?所以啊,咱们在上面呢,给它定义一个叫case,咱们叫class,嗯,咱们就叫做buffer,会不会好一些呢?就叫buffer啊嗯,好了,然后呢,里面给他来一个咱们叫R,咱们叫就叫total啊,叫做总和嘛,然后给他一个浪,哎,就是一个浪啊嗯,然后呢,再来我们写上咱们叫VR,咱们叫city map啊这个map是什么意思呢?就是我们的这个啊里面的建对嘛,咱们叫able。好,咱们的点咱们的这个map啊嗯。好把它放过来,放过来以后,那这里呢,就是我们的string,这个就是long了,诶所以啊,就这么一种感觉啊好,那么我们就把buffer呢放过来,诶所以呢,这个应该是我们的buff份,嗯,好了。
11:10
所以大家可以看到我现在的这个,嗯,泛型就定义好了,那么定义好之后,二我们应该重写它的方法,对吧?重写它的方法,那么你重写方法的话,那么我们来看一看,来给他重写,重写以后其实有六个方法,那有六个方法,那么这六个方法其实啊,最后的两个方法呢,它是跟我们的编码相关的,这个其实呀,对于我们来讲应该比较好写,为什么呢?是固定写法了,比方说你是自定义的,你自定义的话,应该有个叫encoders啊,有个叫encoders,嗯,拿过来,拿过来以后放过来点啊,咱们点了以后呢,我们写上咱们叫product,嗯,那如果呢是我们的串的话,它其实里面有一个叫做点,我们叫做什么呢?来咱们的这个string,哎,这么写就行了,如果是什么long啊之类的,它有skylala double都有相应的啊,所以这两个方法呢,其实是固定写法了。
12:05
那么就剩下我们上面的四个方法了,那这四个方法对于大家来讲我们相信啊,跟咱们前面一做对比呢,其实我相信写起来并不难,首先第一个,第一个呢,表述的是缓冲区啊,咱们叫缓冲区的一个初始化,对吧?那么初始化对于我们来讲的话,那首先那么肯定是个buffer,这没说的,然后呢,总和是零啊,那么接下来呢,应该就是一个muable啊,Able点我们的map,然后给他一个我们的这个写上string,咱们叫做浪,嗯,OK,给它一个long,然后呢,加上一个括号就行了,因为什么都没有嘛,就是个空的,不就这意思嘛,叫缓冲区的初始化,然后这个reduce功能,它表述的是更新啊,来写上咱们叫更新,嗯,叫更新缓冲区啊,诶,更新咱们的缓冲区。嗯,数据,那这个呢,其实就是我们的什么呀,那个city啊,这就是我们的city,而这个呢,就是我们的buffer,诶buffuff就可以了啊好拿过来,拿过来以后呢,首先第一个咱们的C来了对不对,那么我们的总的数量是不是得相加了呢?所以呢,我们点点了以后有个叫total,嗯,好,然后呢,加等啊,咱们写上total,然后呢加等一表示的是一个式过来了对不对,好,然后呢,再来干嘛呢?我们的这个buffer里面会有一个,它会有一个city map,这个map呢,我去取一下叫做点叫get,我们的or else,我们叫city,看看我们能不能到,如果能取到就取过来,取不到就是个零,然后呢,加上一,因为你当前来了一条数据嘛,所以呢,这是我们的一个新的数量,哎,新的数量好了,那么你新的数量有了之后,你该怎么办?是不是应该把缓冲区给它更新一下呀,所以点我们叫C。
13:57
APP点啊,我们写上叫update,你把我们的这个city啊给它更新一下,我们这里写上叫做new count,嗯,好了,那然后把缓冲区一返回就可以了,所以啊,其实就是一个把map的值更新的一个操作啊,更新缓冲区,那么你更新完毕以后,当缓冲区处理完成以后,分布式计算多个缓冲区该怎么办?我们说了啊,该合并缓冲区,咱们叫合并缓冲区数据啊。
14:28
好了,那这个里面呢,我们就放过来,放过来以后我写上咱们叫八份一啊,这个写上叫八份二,嗯,好了,那么八份一,那其实说白了,他们的总和相加呀,咱们的total加等我们的八份二啊,然后呢,点我们的total,诶好了,接下来呢,我们应该怎么办?是不是应该我们是把那两个map呢,给它合并一下,对不对,我们把两个map单独的拿出来吧,好吧,咱们叫MAP1,它等于咱们叫八分一点,我们叫做c map再来一个咱们叫做八分二啊,然后呢,有一个我们的二,这个叫做我们的C啊MAP8分二就是它了,那么两个map我们如何进行合并呢?其实很简单,之所以很简单呢,其实啊,我们说咱们当中有一个叫left,就是我们的map一点,它和我们集合之外的那个集合呢,做聚合,有个叫for left,你把MAP2给它传进去。
15:28
句对吧,传进去以后,那么你该如何聚合呢?这里我们就写上了,咱们叫做case啊,咱们叫做case,这个case呢,我们给它来加上,嗯,那么好,我们这个map是什么样子的呢?咱们这个map呀,其实这个样子同学看来写上一个map,这是我们的map,然后呢,我们要跟什么做聚合呢?跟我们的那个key和V,咱们叫city和那个叫count啊,对吧,你这个map应该跟他们做聚合,然后呢,我返回一个map就可以了,那么我们这个map应该返回什么东西呢?它应该获取那个new count新的数量来,它应该等于map.get or else city,然后给它一个逗号0L,再加上一个我们的这个count,你这么写就行了,然后呢,我们的map点咱们叫update,把那个city放进去,然后呢,把new count放过来,所以啊,其实很简单,就是一个我们的集合之外和集合之内的数据做聚合的。
16:28
操作其实就是两个map的合并啊,我一返回,返回之后,那么我们这个八分一啊,点我们的c map就是我们聚合后的结果就可以了,然后呢,你把8UFF份一一返回,那就够了,哎,就是这样啊,所以这是一种方式,但是呢,我相信呢,其实有的同学可能在这个环节上并不是很明白,对不对,所以怎么办?没关系,我们可以呢,再给大家改善一下,就是两个map的合并啊,这个其实就是两个map的合并操作,嗯,好,那如果这个大家不明白的话,没关系,咱们来给它注掉,注掉以后干什么呢?我们可以这样,我拿其中的一个map,比方说同学看我就拿那个MAP2,你拿MAP2啊,然后点我们叫做什么呢?咱们叫for it。
17:18
你把它的每一个取出来,每一个值取出来,你每一个值取出来的话,那不就是我们的city,我们再加上count吗?对不对,好了,然后呢,你这么写完以后,你要怎么办,你是要看那个一里面有没有吧,对不对?同学们,所以我们的MAP1咱们叫做点啊,咱们叫get or else,然后呢,看看这个city咱们有没有值,如果没有的话,那么就写个0L,再加上我们的count就可以了,写完之后,那么这个地方应该是new啊,咱们写上new,咱们的count,好等于等于之后那么我们的这个什么呢?Map一点咱们叫update,把city放过来,叫做new count放过去是不是这么写也可以啊,也可以之后,那么我们循环之后,这个MAP1是不是就已经发生了改变,然后呢,我们的八分一啊,来放过来,放到这儿来啊,然后它等于我们的MAP1,诶这么写。
18:18
就够了,嗯,其实啊,你要不那么写也没事儿,但我们这么写比较明确一些,对吧,然后返回一个BUFFER1,不管你用什么样的方式,你的目的都是为了把两个map合并在一起啊好,那这个写完之后,其实就剩下最后一个了,最后一个其实啊才是关键,因为咱们真正的备注就是在这里完成的啊来。那这里呢,我们首先呢就来写上啊来咱们叫做什么呢?嗯,咱们叫做将啊统计的结果啊,生成我们叫生成字符串信息啊,字符串信息啊,那这个东西我们该怎么去做呢?对不对,首先我们这里呢,一块的来看一看啊,咱们来看一看,呃,我现在把这个呢,加上一个它咱们叫remark list,就是每个城市的备注对不对,所以等于啊咱们list buffer,因为我们的这种可变集合的方法更好理解一些,所以啊,咱们写个string,写个括号啊。
19:14
好了,放过来之后,那这个时候呢,我们只需要在最后的位置,大家看一下我们的remark list,我们只要在最后的位置干嘛呀,给它make string一下是不是就可以了,同学们想一想,我们点一下咱们叫make string,中间用逗号隔开不就够了吗?你看这他们中间不就用逗号隔开的嘛,对吧?诶,就是这样啊,好,那我们该如何来完成它呢?首先第一个你先把它的总共的数量拿到咱们叫总共的count,等于咱们这个地方改一下名字,咱们叫八份,嗯。好,咱们叫buffer,点我们叫总共的数量,嗯,好了,然后呢,再把那个我们的C,咱们的map,诶,等于咱们叫buff.c map给它取出来,取出来以后,那么接下来我们要把每一个子进行操作,但是呢,它这边是有要求的,什么要求呢?他会把那个比率比较大的放前,对不对,把小的放后,然后如果有超过两个的话,它有个其他的概念,咱们这里不能那么复杂了,咱们就不要小数点了,用我们的这个,嗯,前面的就够了,所以我在这里干嘛呢?我这么写叫c map.to list,它的有个排序的概念,就是说它会按照我们的点击量来进行排序,那map是排不了序的呀,所以to list点我们给它来一个叫salt list,哎,这个sort位置当中啊,就会有我们的左边和右边来,咱们的right,嗯,好,放过来,放过来以后啊,咱们放过来,放到这个位置放过来。
20:48
啊,嗯。好,那么翻过来以后,我们说过了,如果左边大于右边,那么就是我们的降序,那恰恰是我要的咱们的left点下划线二_二就是我的点击数量,如果它大于right点下划线二的情况下,这个时候我们的数据就按照降序的方式来排列了,所以叫降序排列。
21:12
啊,降序排列,那么你排完之后,你拿到的,其实啊,咱们写上咱们来啊,咱们叫city count,嗯,City count,我们的list我们已经是排过去的了,那么你排过去的话,我们要那么多吗?可能也不要那么多,为什么呢?因为对于他来讲的话,是不是就只需要两个呀?啊其他咱们再说对不对?所以我们这里点一下,咱们叫take啊给他来个二啊,就取两个,你太多了我也不要啊,就先取两个,取完两个以后,那我该怎么办呢?那么首先我们得判断它有没有更多的吧,所以啊,咱们叫做has more。诶,还是啊干嘛呢,我们叫c map.s啊,然后呢,我们来判断一下它是不是大于二,如果它大于二的情况下,说明啊,咱们取完两个之后还有更多的对不对,诶这个咱们慢慢来,不着急啊嗯。
22:04
好了,那我现在干嘛呢?我就把咱们的这个list呀,咱们挨个去遍历一下,所以点我们叫做for it好了,那我这么写完以后,同学们想一想,我的这个for it的话,我就可以直接写个花括号加,加上一个模式匹配啊,我们写上咱们叫做city,嗯,再来我们叫做count。好了,然后呢,放过来,放过来以后,这是我城市的名称,这个是什么?是我们的那个数量,我们总共的数量在这儿,那么你用它除以它的话,其实不就是我们的百分比嘛,对不对?然后呢,我们再把名称加上,这不就够了吗?所以啊,咱们这里来咱们叫remark list点咱们干嘛呢?叫aend,叫追加,追加什么东西啊,咱们叫aend啊,来aend,嗯,OK,你追加什么东西啊,你不就追加一个我们的city的名称吗?所以来咱们写上咱们叫做city,嗯,好,然后呢,我们再加个空格,然后再加上什么呢?一个比率,这个比率后面加个百分号吧,但这个比例是多少呢?你得算一下了。所以二这个比率啊,来咱们应该是那个count,它乘以100,因为你直接除以的话,那么它应该会有一个什么,我们的小数,这样的话可能算的不准确了,所以我们乘100,然后把这个二呢放到这儿,所以写上一个二。
23:26
好了,同学们,你这么写完了以后,现在咱们的这个城市的这个百分之就有了,对不对,诶就是这样的,同学们这就够了啊,但是呢,因为呢,他说了,如果超过两个城市用其他来显示,那就意味着如果你要有更多的话,所以来咱们写上叫if if的话,这里写上咱们叫has more啊,咱们叫有更多的。如果有更多的话,这个remark list它也应该A判,但是它这个判呀,这个地方就应该改了,应该改什么呢?叫其他,它叫其他的话,这个值怎么来呢?这个值啊,其实我们应该是用我们的百分比减去它们的一个比率吧,所以我这里给它来一个啊,咱们叫做什么呢?叫做R萨诶等于0L就是这样的,那么这个阿萨姆等于什么呢?它应该等于这个R啊,对不对,所以我们写上叫做加等二。
24:18
来个15%哎,加十五百分之二十加二十十五加二十百分之三十五,那么还剩下65对不对,所以我们这里呢,就用我们的什么诶哦,这个写错了是吧?应该用一个二啊,然后这边呢,应该用一个我们的什么呢?用一个我们的100,再减去咱们的这个二三。诶,你这么写就行了,这个前面就是某个城市,这个呢就是其他,因为咱们前面排过序,所以它会按照顺序来for each循环便利,所以啊,这就是我们基本上的一个实现的原利啊,那我们再说一遍,咱们在前面先把咱们的缓冲区的数据拿到,然后呢,先进行了一个排序操作,所谓的排序操作就是因为它有一个排行的概念,对不对啊,谁的比率大放前嘛,那比率大不就点击数量多嘛,然后呢,我们再看看它有没有更多的,就是超过两个城市的,如果有把其他加上,如果没有,那其就算了,对不对,诶就是这样的啊好,那我现在呢,把这个代码呢,已经写完了,写完之后得用一下呀,所以拷贝拷贝以后放到前面去啊,放到前面去,前面的这个地方应该有一个叫functions啊,Functions,然后点叫做UDA,把这个new放过来,放到这里就够了。
25:33
所以啊,这是我们之前讲过的啊,就是把一个强类型的聚合函数应用在我们S文当中啊,跟弱类型相结合,就要用这个东西,好,那我们现在呢,写完了,咱们试一试运行一下。好,同学们,我们现在的结果呢,已经出来了,对吧,你看结果就出来了啊,这个结果呢,我说了会有一定的误差,是因为呢,他们这里呢,有小数点省略了嘛,省略以后它可能不到了啊,这个其实我们的问题啊,但是没关系,只要咱们基本的步骤是对的,其实你就是把它的小数点再加上呗,对吧,保留两个小数,哎,做个格式化就行了,咱们这就不做那么复杂了吧,嗯,好不好,同学们,行,那我们这个其实需求啊,就算是做完了啊同学们,呃,记住了,我们的重点呢,其实不在于circle文怎么写,我们前面这些circle,我相信大家之前在学have的时候都学过,我们的重点在于怎么去用u daf,怎么把基本的这些方法呀,这些东西给大家演示出来,最重要的这些东西是我们的一些常用的一些方法的调用,那么到底这个蛇口文该怎么写,你们后面的数仓的项目当中会来练习这些东西好不好?同学们不要把这个重点给他误会了啊。
我来说两句