00:00
还是同样的,我们把前面的前前一天所讲的内容呢,做一个回顾,好吧。其实昨天我们所讲的东西啊,就是从章节上来看并不多是吧,但实际他对于在公司当中应用也好,或者在面试过程当中也好,哎,昨天所讲的内容呢,都是重点,都是重点,面试当中肯定也问这些内容,然后你工作当中也是需要用到这些具体的函数的啊,如果说你真的是做have这一块的话,当然你如果不做have的,那你就没有什么工作重点而言了,是吧?那我们来看一下,首先我们讲的是几个排序,这个排序我们要把排序搁一块讲嘛。来看一下我们总共讲的有有几个,四个吧,四个order by so by distribute by和class,其实这四个讲是讲排序,但是这个。它不是排序吧,它是跟说半搁一块用才是排序吧,跟说在一块用才是排序啊,这个意思它本身是其实是分区的作用啊,而且这个分区就跟MA6当中的一个分区是一个意思的。
01:07
然后我们来看一下这个欧指的是什么。全局排序吧,啊,全局只有一个,无论你什么呀。无论你有没有手动去设置它的一个。Reduce的个数吧,昨天我们测了是吧,它第一次时候我们在这个地方是没有改它一个值,它默认是负一吧,哎,它只有一个reduce,也就是输出的出来的结果只有一个,最后我们把那个reducer改成三,再测了一次吧。测类斯之后发现它的结果还是只有一个文件嘛,啊,也就是说它这个order,它自己就规定了自己这个框架,我们讲的不是还翻译成map,它自己找have底层写好的模板,对吧,那它这个模板里面就已经写好了,你只要用了model。他就会干什么。
02:00
只会启用一个瑞来计算所有的数据,所有的数据是这样的,那同样的它默认的是一个声序,你还可以让他降去把DC这个东西呢,是跟MYSO当中是一样的。是一样的啊,然后这个就是帮助查询的什么别名啊,或者多个列排序啊,都是可以的啊,多个列排序就是首先按第一个列排序吧,第一个列相同了,再按第二个列吧,如果第一个列都不同了,那就按第一个列排序就好了,就是我们在MR当中所写的一个二次排序吧。二次排序,就是你自定义了一个Java病,然后Java病的那个。Compel方法是吧,写了按两个字段,如果第一个字段相同了,你再比较第二个字段是这个意思,好,然后之后我们讲的是这个第二个说。说,它指的是每个reduce内部进行排序。啊,每个它对于全局结果来说不是有序的,不是有序的,但你要注意的一点就是你想要用。
03:07
那你一定要设置一个什么内容啊。Reduce的个数吧,一定要设置reduce的个数,要不然如果说它reduce个数还是一个的话,其实它这个结果跟so跟all是不是一样的呀,它也是因为它只有一个呀,那你是针对于每个内部进行排序的,其实你排的它是一个全量的数据。全量的数据是这个意思,所以说你只要用到这种,你一定要想起来。它有一个属性来控制它reduce的个数的啊,这块一定要做修改的,要不然就没有意义,没有意义好。之后是我们讲的这个第区。啊,第区它其实是一个分区。分区这个地方类似于我们MR吧,是不是跟我们妈就一样的呀,它的一个分区,所以说这一块你只要用了ribu BI,你也要设置什么。
04:04
Reduce的个数吧,个数跟我们MR当中所写的代码一样,你只要用到了一个分区规则的话,那你最后在封装那个job的时候一定要写reduce的个数是什么样的?而且我跟大家说了,比这个尽量要保持跟分区的个数一样吧,一样吧,而且昨天讲的那个内容,因为大家没有你们晚上回去测了吗?就我们昨天讲这个,你分区号是1234。四然后你的就是个数设置为四个,最后报错这个问题。有人错了吗?没人测是吧,那那你就记一下好吧,那你把这个记录告诉你,肯定对的,我我测过了。我错过了。所以说这就要求我们什么在自己写自定义分区的时候,你那个分区号一般从零开始,而且是一个一个累加法,你不要去跳着来,不要跳着来,因为跳着来尽管你后面这六次个数跟你的分区个数保持了一致,但是它还是有分区找不到啊,因为他是拿着分区号。
05:15
就是你get partition这个方法里边啊,它获取的是分区号啊,它的定义的是一个分区号,然后你的个数啊,它一模以后啊,哎,它定义的是最后输出的一个什么文件啊,就是那个01234。所以说在reduce个数限定以后,它输出的文件的一个文件里一定是从零开始的,而且一个一个累加的啊,所以你要保持前面的一个分区号,保持累加,保持累加,呃,有有印象的或者有经历的同学还是测一测,测一测你印象深刻一点。啊,光听一遍的话,印象不那么深刻啊。好,之后是这个class by class by是我们所讲的它当区BY,就是这个分区字段和排序字段相同的时候。
06:08
你可以直接用那个class版啊来代替代替,但是它有一个问题吧,就是只能是。就是只能用默认的,它不能指定它的一个什么顺序降序吧,你加DSC,昨天我们加了DSC是不是错了呀?哎,就报错了,他不让你指定后外的一个顺序,它只有默认的这种顺序,只有默认的顺序,然后现在加上那个什么partition by是吧?啊,什么order by distri class已经有很多类似的这种内容了。啊,然后后面我们讲的这个分筒又多一个吧。这个是classed by啊,你你要把这两个东西分开记,我们当时不给大家说了吗?就是你这种加ED的是不是建表语句里边的分别是建的是分区表和分组表啊。但是你这种不加ED的是不是都在查询语句里边呀,就是加上select的这种语句里面来去用的它分别是什么分区,然后说前期排序,然后每个reduce内部排序,还有一个class by,还是它两个结合起来的一个排序啊,你一定要总结这个问题,其实分筒和分区是一样的,它都是为了。
07:20
数据量太大的时候,来减少它的一个获取数据的一个过程嘛。是不是就这提高效率的嘛,提高效率的你像分区我们当时讲的他怎么来提高。就是你在执行查询语句的时候,最后加一个V代码,哎,来指定你在从哪个区里边获取数据。从哪个区里边获取数据,然后这个分桶呢,他其实也是他觉得你放在一个文件夹里边,一个文件还是过大,他才考虑什么。把具体的数据给分割开吧,把具体的数据给分割开,优化一个管理的。
08:00
管理的,当然它自己有一个属性来控制它是否分土吧,啊属性名字倒可以不用记,但是你得知道有这么个东西是吧,因为你在建分钟表的时候,你可以去查一下,如果你忘了它还有这个属性的话。你可能真的就哎,你就在想为什么一直这这个桶分不成是吧?啊,你分桶的时候一定要记得有一个某个属性来控制它是否能够分桶啊,至于这个属性的名叫什么。这个到时候你要真用的时候,你去临时查一下都来得及,但是你得知道有这么个属性,脑子里边有印象啊,到这种程度就行了啊,你像这种属性名,你说全部给记住没有意义,没有意义你也记不住,你想想看它那个属性多少,再加上什么都管,你想想后面还有很学很多很多的一个框架,这么多属性哪记得住去是吧,但是你得知道它有大致有哪些属性啊,因为你到时候要用的时候,你就方便去找,方便去找好,然后还要指定它的一个。
09:02
Reduce的一个个数吧。你让他按照自己的规则来,你就设成负一就够了,这是负一就表示reducer的个数啊,不是在外面他给他设定了,而是在执行这个hi克语句的时候,它具体来分析这个hi克最终能分多少个radio法,你就像现在咱们分桶,分了四个桶,最后是不是形成四个radio测呀,它会不管你的数据量有多大的,他就不看数据量了。所以说你让他按照自己的规则来。就好了就好了啊,之后就是分工表建立完了之后,就是我们对分工表的一个抽样查询。啊,主要是有这么个字段啊,他们赛猛啊抽样注意它这里写了一个什么or ID是吧,其实大家可以测一下这个or ID可以不要,不要的时候它跟奥ID是一样的吧,还是一样的。主要的注意的就是X跟Y啊这两个内容,X代表什么意思,Y代表什么意思?
10:02
这个你要清楚,X表示的就是从哪个桶开始抽是吧,然后Y表示抽多少数据是吧?哎,抽多少数据,这个抽多少数据其实有统数,假如说统数是C它们的比值来决定的吧,啊,他们比值来决定抽多少数据,那所以我们要求。这个Y啊,是统数的什么倍数或因子,这个因子其实就是那个公因子的因子,就是约束对吧,约束的意思要要求这个,因为它能保证。你要不然是倍数的话,你就抽整个的桶,要不然如果说是因子的话,倍数的话不是说反了是吧,因子的话表示抽整整个的同啊,然后如果是倍数的话,正好抽同的几分之几是不是啊,是这个意思,那其实我们测了,如果你不写它倍数或者因子的话,它也可以是吧,就像昨天我们测的这个四个桶,然后我外写成了三是吧,他也能抽取来数据,但是你并看不懂它抽取的规则吧,啊就是你没有按照要求去传入他的一个要求的数据,他给你返回的数据呢,你也看不懂。
11:15
你也看不懂啊。你介绍下,这样写就行了,然后这边注意的一个问题,就是X值小于Y的值对吧?我们也从数学角度分析了一下,它为什么不能大于Y的值是吧?哎,不能大于Y的值,因为如果大于Y的值的话啊,有可能会最后一个桶抽不到吧,哎,就超出了统数的大小吗?统数的大小他肯定查不到了。然后之后是我们所讲的其他的一些查询函数,查询函数啊,首先是这个NVL。都没有,它其实就给值位long的数据赋值是吧,如果它为none的话,你可以用一个默认值来代替,当然这个默认值可以是一个固定的一个字符串,也可以是一列吧啊,也可以是一列,这都是可以的啊,这两种方式都可以的,但是如果说你用另外一列的话,当两个列都为当的时候。
12:15
他就没办法了吧,他只能给你返回浪吧,他只能给你返回。这个NVL他这个函数啊,是不支持三个的,不支持三个的,奥瑞他也有NV,他是支持三个的,那什么意思呢?就是如果两个都被闹了,它就用这个值代替。其实你们到时候我们讲的那个自定义函数的时候,你们可以自己实现这个语法也是可以的。啊,也是可以的,自己实现这个函数,你自己自己编写一个,假如说你真的有有这种需求的话,啊,公司当中还有A列啊,获取A列的值,如果为档,用B列值,如果AB2个列都为档的话,再给它一个默认值就三个,但是当前我们还有当中ma,你可以测一下,我当时应该测过了,就是它是不支持的三个,但是or瑞当中它它是支持的。
13:05
啊,其实这个因为我们have的学到那个自定义函数这块,你就可以感觉到它的一个扩展性非常好,很多一个函数它没有的,或者说不满足需求的人都可以自己去。写代码实现啊,然后把它把这个方法自己给它创建出来就OK了,OK了好。之后是我们所讲的这个斯顿。这块主要的你要记得是一个kiss then,还有个按L按,总是这样。就是kiss一个字段,当它是什么样的时候,当然这个字段其实可以写到问里面对不对啊,就是你单独写一个kiss,后面不跟字段也可以的啊,这个也是可以的,你当你问的时候啊,你再去指明这个字段具体是什么。Then就是当条件就问你们条件满足的时候执行,在把不满足的时候执行二,但是你要记得。
14:03
每一个case语句后面都有一个and结尾吧,And结尾这个你是不能丢的,我们能丢的,我开始跟他说了,你自己去找一下之前买so的那个什么。什么90成绩等于U的那个自己念一下啊,因为这些东西你说之前你学麦搜课的时候也挺熟的是吧?啊,当时也记得挺清楚的,因为就时间过的长了就忘了,但你这个时候再复习一遍,那就捡起来,然后到了面试之前再看一遍,到那个时候你就会比较熟了啊,对于它的一个用法呀,就比较熟了啊,这块有个问题,就是很多同学也不是很多吧,应该班上有两三个人是这样的。就是执行K问的时候啊,他是语句这个语句啊,我我当时是在这个地方敲的,对吧,我敲了之后粘进去的,我不是在这敲的嘛,敲了粘进去,那有的同学他是直接在这个C格萨D这个窗口敲的啊,最后说语法过不去是吧,应该是他CQD的一个编码格式和还有底层一个编码格式,因为它是哪块出了问题啊,你之前正常敲都没问题,对吧,因为这个地方出现了什么。
15:12
中文啊,一遇到中文的时候,你一定要考虑它一个编码问题,应该是CID跟那个汉底层一个编码格式的问题。啊,所以说你从外面啊,外面敲完了之后,给它粘进去是没有问题的,不是你的语法错了,不是你的语法错误,你往上翻的时候,有很多同学发现他说这个地方多了一个小括号是吧,多了一个小括号就是从外面敲了粘进去啊,从外面敲了粘进去,不要在这里面敲,还有你们有没有错,这个题就是这个table。Table是过不去的啊,Table是过不去的,在汉语的这个table是过不去的,我一直强调你要想缩进,为了好看一点啊,你是不是用空格啊,你用空格,你不要用table table在这个语法里边也是过不去的。在这个have的这个窗口里边啊,是过不去的啊,这你要注意这点就行了。
16:00
这是kiss问啊,重要的还是自己要去练一下之前的那个练习,其实买其实so或者help这一块啊,他你说这些函数说难在哪,他也没什么东西是吧,主要还是自己要多练熟了之后,你其实你接触到这些新函数,你用熟了之后,其实跟用some和com不是一样的吗?其实都是一样函数,你像some这个函数其实是一个挺复杂的函数。你想想看,为什么sum这个函数其实让你自己写真不一定写得出来,因为它是对于它是一个聚合函数。他要读每一行数据,要缓存下来之后做累加的。它实现的过程还是相当复杂的,但是some用起来是很简单的是吧,而且一用就懂,其实就是大家对这个什么contact呀,这些东西是不熟,用的少,你买sol当中也没有怎么去用这些函数,虽然买sol当中有抗的,但是很少用嘛,很少用那很少用,用关键大家还是用的不熟,用多了就好了,所以说搜狗这块一定要多练啊,之前不给大家说了,那个let这个网站嘛。
17:11
啊,自己去找一些搜课练一练,搜个练一练啊,所简单的练练,不要一上来就整那个最难的是吧,发了半天也也整不出来,浪费时间是吧,你就主要还是练练手,练一些简单的一些语法啊,练一些简单语法主要是大家对于因为搜狗学的时间不长啊,不长,你像如果班上做过Java开发的人肯定这块就会好很多,因为他们对于一个sor用的还是挺多的。所以他们肯定更熟一点。之后是我们所讲的这个行转列,行转列主要是最后我们主要其实测了一下这三个函数是怎么用的吧,看了一下它的一个语法,然后单独的每个函数单独的测了一下它是怎么用的,之后看了一下结果,到这我们就能之后看到。
18:00
根据原始数据,然后根据他的一个需求啊,最后一步一步的把自己把这个搜写出来是吧,是这样的,然后主要是这个con。Con其实就是连接多个字符串嘛,拼接后的结果。直接拼接的,当然这里面可以传什么。Column嘛,传列进去也可以吧啊,传列进去也可以的,还有后面当然这个con它传的列可以是什么in特类型啊,随便类型都行吧啊这你要注意,当时我们测的不是那个DPD和d name可以拼接的吗?还有印象吧,然后后面我们讲的这个con开的位,它其实是它的一个特殊形式是吧?哎,它是把每一个分割符啊,如果说你中间分割符的是一样的话,它可以把分割符提到前面来是不是?后面他也可以跟着字符转,也可以跟着练,但这个时候他有要求啊,就这个练。什么要求啊,当时还记得我们报的错吗?我们当时也是用康开的位置来连接第D和就报什么错。
19:10
他说必须是string类型,或者是一个string型的数组嘛,啊,所以说它对这个函数啊,跟这个函数的不同点啊,有两个,第一个就是它把一个分隔符提到前面来了,你会少写很多的一个分隔符,第二个就是它里面传的一个参数,哎,一定只能是字符串啊,或者说你传的一个是字符串数组。啊,这是可以的啊,其实这两个函数都是一个udf函数,就是你想这两个函数都不是一进一出是不是啊。是不是你给他一个函一个值,它返回的是一个值啊,就是你给他一行数据,它返回一行数据,这个也是吧。是不是啊,一行数据啊,你虽然传了多个列,但是这多列最终呈现的是不是一行上面一行数据,但是你要注意这个。这个函数。
20:03
这个函数。它是将某个字段进行去重,我们昨天演示的是这样,是不是我们把这个name放进去,最后他们把拼接成了一个数组,对吧?啊拼接成了一个数组,你看这个它就是类似于送阻这种函数了。它是不是跟some很像啊,你想想看,Some如果是sum的话,这地方是都是一的话,它最终出来一个五是吧,是不是你给他五个数据,它出来一个数据啊。这个collect set呢,你给他五个数据,它最后出现了一个数组啊,一个数组其实是一一条数据吧,哎,这个叫聚合函数啊,它跟sum这种是类似的,哎,所以说就能看出来最后一个函数啊,其实跟这两个函数是不一样的。不一样。所以其实我们这个行转列啊,这种操作重要的是不是在于这个函数啊。在这个函数上面啊,其实你想想看,这两个函数,我们是为了拼接什么。
21:04
把这个白羊座跟血血型拼到一块吧,是这个作用的,它的一个行转列,真正生效的一个行转列是它。是这个。来了啊,是它起的作用啊,它可以实现这种行转列,它可以把多个行。放到一行里边,多个行放在一行里面。后面是我们所讲的一个列转行。列转行的一个操作,它是一个X叫炸开,炸开这个函数它可以单独用吗?是不是可以单独用啊,当然我们测了之后,哎,单独用的话,它是把这一列,如果说你对这一列进行炸开的话,他把这一列全部给展开了吧,全部给展开了。但是我们当我们想实现这个需求的时候,我们当时是不是想呢,直接把movie写在前面是吧,把movie写在前面,首先我们思考一个问题,假如说他语法能过,就是他执行有结果,它肯定也是不对的,是吧,因为他肯定是做的一个低卡尔级,其实事实上呢,你只要用了这个X explore这种。
22:10
UDTF这种函数。它是不能跟原表的字段直接进行查询的吧,直接进行查询的,它一定要跟这个lecture view啊联合在一块用的view我们讲的是一个什么,相当于这个东西啊,对原表进行了一个测写,它形成了一张测写表,这是测写表的表明。测写表的表明,然后这是测写表里的字段,字段名在这。啊是这样的啊,侧写表的表明,然后它一个字段名。是要形成侧写,然后这个Li,其实它也是做一个切分啊,也做一个切分,它也是类似于这种explore。啊,你想想看的,你当时你如果说一行数据,你数据都是按杠T分割的,你Li。
23:00
中间的一个分割符写杠D,它是不是跟这个X explore很像的呀,他把一行数据变成了很多条啊,很多条,这是我们所前面所讲的一些查询哦。
我来说两句