00:01
好,那我们还是把前面的内容呢,做一个快速的回顾,主要就是讲的这个函数这块啊,自定义的一些函数,呃,这里面呢,我们主要自定义了udf UD TF啊这块,呃,其中还有一个udf呢,大家学SPA的时候,因为那个项目咱们会用啊,到学SPA的时候呢,还会再给大家扩展,就35,就九,呃,而接下来咱们要做的那个后面那个输仓项目,呃,我们主要用这两个。啊,主要这两个,所以呢,现在我们主要讲的就是他们俩后面还有一个u.com,就类似于是sum这种函数的一个功能。Sum函数的一个功能啊,那那大家想一下啊,就是假如现在我们没有没有讲这个内容对吧,那你就是我们稍微的想一下,假如说真的要自定义这个的时候,他同样的这个地方出始化什么输出对吧?那你觉得这个地方要出始化什么东西啊。对,输出我们可能还要对吧,我们想象的,那除了这个之外,你看啊UDTF这个东西是不是写进来,我就直接给写出去了。
01:09
但是作为udf呢?你读一行这个数据能写出去吗?是不是最终要读完了之后才能写出一条吗?或者这个分组结束之后才能写出去一次吧?也就是说他要读很多数据,所以它除了我们所说的假如说要定义输出,它更重要的东西在于哪?中间的库存。能,那懂啊,因为这个是类似于sum这种函数,那你想一下sum函数我们一行一行扫描的,对吧,咱妈读不是一行一行读的吗?那他怎么能计算上面的功能呢。他们读一行,把这个数据记录一下,就类似于在迭代器里面做这种操作,对吧?啊,迭代器里边做种操作是这样的啊,是类似于这种功能的啊,类似于这种功能的,所以它更重要的是中间缓存的一个问题,因为不到最后一条数据,他都他都不能出去啊,都都不能写出去。
02:03
好,那这块呢。大家稍微有一个印象,因为后面后续的课程当中我们还会接触到,所以呢,也就是说三种呢,大家都要会,但实际上在生产环境当中啊,最多的用的还是它。优点还是用的最广的啊,用的最广的好。那之后呢,就是说它的一个,呃,应用方面,你写好代码之后,把胶包扔到集群,呃这块呢,我们当时我当时举了一个例子,说这块呢,放在什么变相丝底下。可以。啊,放在他自底啊,但是呢,这个有一点不方便,假如说你要用的话,你每一次都得去干什么,艾了一下,艾了一下,但是我们把它放在的力下,你一启动的时候,它就自己加载到环境变量里边,啊,这个I的class呢,是把它加到have的环境变量里边。Have的环境变量是的,而内保持是默认会的一个文件夹啊,当时我们看到了,我们重启完之后是不是可以不用ID对吧?啊,重新完之后会坏掉,但如果说你放在。
03:06
不是的,立下,那你要去重新艾特一下啊,当然了,我们也创建了一个什么临时的永久的都可以吧,啊临时的我们发现。被害退出来之后,它就怎么样了,失效了对吧?哎,他就没有了,但是我们创建的把这个temp给他干掉,创建了有守的就可以用,而且我们还知道它只能在里创建这个函数的什么。库里边用。对吧,默认的你在哪个库,它前面就默认的加了,假如说我这个have库,对吧,它默认前面加了have.my log对吧?啊是这个意思啊,就只能在这个库里边去用,同样的,如果说你这个是创建的呃,永久的函数,你想把它删掉,删掉我们用的是什么。状了,虽然我没有删,但是你要注意也要在那个库里面去删,那你懂啊,不要在其他库,因为其他库它根本就看不见这个函数啊,就看不见,也就是说你在哪个库里面用就在哪个,给大家刚说一个点,在生产环境当中,如果说我们要用到资定函多,你最好创建的时候加一个什么。
04:10
库名你不管是不是在这个default库里边,在defat库里面我也加一个default点买log对吧?啊肯定不会出错,这样呢,就标示着当前到底是谁的啊,到底是谁的,而且呢,呃,有很多人问我就是这个,我们之前有那个受方来看系统函数对吧,那关于这个自定义的函数。啊,看不了你就只能去记,所以呢,在生产环境当中,我们更多的还是选用的是这个临时函数,而且是在调整里边用的,不是说进来。因为我们说了这这个并have这个窗口更多的是做测试了啊,更多的是做测试了,而更多的时候呢,我们每天执行的任务,或者每周每个月执行的那个任务啊,是写在脚本里边的,对吧,我们有汉杠E或者汉杠F这个方式来执行,那你在这个搜索,假如说你要执行的是一个什么A这这条思索比域,那在这个前面呢,我们要添加一个大件。
05:07
艾加对吧,这条命令啊,一个分号,然后接下来是CRA的temp,然后什么什么函数一个分号,然后再去执行这个什么,最后那这样的,当我们have-E或者说have-F执行完了之后,这个函数自体也是为什么。删掉了。自己也被删掉了,是这个意思啊,也就是说生产软件当中,我们尽量的用的这个temporary啊temp除非是有一些关于什么,呃,全局的所有表都默认都要用了,就是说我给所有的表加个字段,假如说啊,加一个用户名等等这些内容,然后你过来时候要做用户名关联啊等等类似于这样一个需求的时候,那你可以建一个永久的,因为所有的人,所有的表都要用的啊,假如说有一个全局的这样的一个函数啊,更多的时候我们还是跟着业务线走啊,跟着业务线走OK,那同样的后面我们自定义了一个UDTF啊UDTFUDTF这些东西呢,也是可以自定义的,比么说呢,这里呢,要注意的一些点,这个东西你要记一下吧。
06:08
对吧,即使哪个类,你要记得第二个就是它吧。这个方法不说了。我们在al回车的时候,他并没有让我们去实现。但是我们一定要干法实现一下吧,啊,一定要去实现一下啊这个。其他的就还好了,其他的还有一个就是这一块标红的这个内容的这个内容他是负责写出的。好,那之后呢,还一个应用也是一样的,之后呢是我们所讲的压缩呀这块内容,呃,这块还是要强调一个点,就是大家一定要把这个压缩和我们所说的文件存储格式这两个给它分清了。啊,他们俩不是一个东西,一一边是我们说的类似于TXT。对吧,还有orc啊,还有那个什么帕啊,还有那个什么CSV啊,还有TSV啊等等,这个都是文件格式。
07:02
啊,文件格式,那我们所看到的还有什么snapy,什么拉斯罗,还有这里边ZZ,还有这个be to对吧,等等这一些,这个叫什么压缩方式啊,压缩方式这个要注意一下,那有同学可能想,诶我怕那orc,我们刚才提到了,你使用orc的时候,它默认是不是有一个。压缩对吧?啊,默认启动压缩,那有同学在想,那我用这个P的时候,我没有指定压缩,那它这个文件格式。最后存出来的18兆变成了13兆,对吧,变13兆它也什么呀,是不是也是有这种压缩呢?不是的,因为文件格式不同,它底层存储的方式就不一样。存储的方式不一样,那两个文件完全一样大吗?这个不一定的啊,这个不一定的,就类似于假如说一个文件,我拿逗号分割。和我拿四个逗号分割,你说这两个文件一样大吗?我这举个例子啊,四个逗号,因为这样我们刚好分一点,对吧,一个逗号跟四个逗号,就是说它中间的分割符啊,还有建了什么索引啊等等这些东西,甚至有的东西呢,有的文件呢,把它变成了一个资间码文件,二进制文件,那想想它这个存储方面。
08:15
大小肯定是不一样的吧,啊,肯定是不一样的,不是说他非得启用压缩这个文件条变小能懂我的意思。OK吧,啊这块呢,一定要做一个区分,这个讲的是文件格式,讲的是如何来存这个文件呢。如何来存这个文件呢?而STEM等等这一套,这个叫压缩,这个叫压缩啊,通过一定的压缩算法啊,把你的数据呢存的更小一点啊,做这个事的好,那这两种呢,是两个不错的东不一样的东西,但是他们俩可以结合的去使用,对吧?我可以使用OC,我可以不启用压缩啊,我可以使用orc的同时让它用自己的Z力这种or压缩,同时我可以用orc采用什么。
09:00
来进行压缩,它可以灵活的来选择的吧,啊灵活的来选择是这个意思,而且呢,它们之间啊,如果说假如说我写的123455个,它们之间是什么互斥关系。你能不能说我这个文件我存成orc格式,我又想存成卡格式。这个不行吧,啊,你从这个上面来理解他们俩,因为通过之前的社会过程当中发现有学到后面的时候,很多人把这个东西分不清。因为我们出来的数据,拉斯我压缩的,最后发现出来的拉斯我。然后斯塞比压缩的,我们也看到了,是不是点斯利亚对吧,再一看到这个,因为大家的印象先先入为主啊,因为我们之前在Windows上看见到的后缀零。表示的是什么文件格式吧,啊,你一看到STEM,哎,它是不是STEM这个文件格式,你自然呢,哎把STEM当成一个文件格式,不是的啊,它只是一个后缀名啊,只是一个后缀名,因为我们说了Linux文件系统这个东西,它本根本就不叫验什么。
10:00
可是没有什么后缀名,这个这个东西后缀名只是他在你在进行压缩的时候添加一下,方便我们用户去干什么区分的,方便用户区分的,其实他叫点或者叫点S,或者甚至不要那个什么点有区别吗?没什么区别吧,对吧?啊就是你那个你是一个文本文件,我叫TXT,我叫点log,我叫TX,我叫TT。对吧,我叫X随便嘛啊,名字随便取啊,因为它不根本就不愿这个后,所以你要关注一下,不要看到后面看到点拉字,我点S这个认为它是一种什么文件存储格式,不是的啊,它只是一个代表的,它是一个压缩文件啊,压缩后面呢,这块是我们所说的,你要怎么去开,当然你可以在直接MR当中去拍。更灵活一点的,我们在哪去拍?在汉当中去开发啊,在汉当中,因为这样更灵活一点,因为在MR当中开了,是不是等于如果说你不再做这些东西做控制的话,那全局默认的就是什么。
11:02
都是看到啊,都看到,那我们想执行一个搜狗的时候,诶,这个搜我们需要有这个压缩功能,那我们同样的像刚才我们所举的例子,去添加下方创建函数一样的,我把这个东西写在我们整个S什么。前面,然后底下有一个搜狗,诶have杠一干什么,一执行它就单次使用了什么压缩啊,这样更灵活啊,这样灵活不要直接给它打开,因为更多的时候可能对于某些任务我们还是不需要压缩的啊,还是不需要压缩的是这个意思啊啊后面呢,我们聊的这个t ST orc啊啊B啊这个格式啊,那这个三个之间呢,我们要理解两个东西,第一个就是我们所说的行存储,还有一个就是我们所什么。列存储各有优缺点吧,主要看你未来读数去哪一种读的更多一些,对吧?啊,你是类似于写select的心,还是类似于写select count?数据啊,读着一列对吧啊一列,或者说C的name啊,逗号sex啊,类似于这样的一个内容,注意这个新呢,也不一定非得写的新,我写的字段很多很多很多。
12:08
对吧,啊,很多几乎你有新代表的十行数据啊,十实例,那我本身把实例列出来了,也不是全局的一个干什么读每一行的数据,对吧?啊这种方式呢,就以行存储,那另外的呢,我们就以列存储的这种方式啊,列存储方式同样的,我们最后也对比了一下它这个内容,同时呢,把那个压缩和存储呢,也结合了,可以搁一块去使用啊,可以搁一块去使用,这个是没有问题的。呃,之后的时候我们聊的一些优化泛抓取啊,本地模式这个都比较好理解一点啊,同样的表的优化这块呢,呃,也演示了,这里边更重要的是哪一个还记得。是不是麦交啊,因为我们说了大表跟小表的问题。他已经优化了对吧?啊,你无论怎么写两个字义都差不多啊,之前的时间,但是map教你这个开启与否。
13:01
时间差大概在十秒吧,当测的对吧,八到十秒这个还是有差别的啊,没有教育,那中间还有大表交易大表,大表交易大表的时候,其实没有更好的办法,主要就在于如果他空品过多对吧,两种解决方案,第一种呢,如果说当前这个品为空,这描数据就是脏数据,不要我们就可以用什么。过滤对吧,先写在不要里面,把空气给它过滤掉。不料,那另外一种就是,虽然你连接字段ID这个东西啊没空,但是这条数据我不认为它是脏数据,这条数据将来还要保留着,对吧,我假如说用level join等等的这个数据呢,它虽然没交易上,没交易上这个字段不为闹嘛,对吧,Weno这个数据呢,我还要。那我们就用什么办法呀,就给他一个随机值对吧?啊,给他一个随机值,因为不给他随机值的时候就会容易产生什么。数据倾斜对吧?哎,某一个任务当时我们测了应该是我记得是22跟七秒的关系,是不是啊,这个还是明显差距的,但是我们加了这个随机数之后。
14:07
时间长了,那肯定的,因为你多做了一个操作嘛,相当于对吧,但是它更均衡了,因为我们数据量很小,我们数据量很小,你所有的任务呢,哪怕你用一个V流散,真的把那一堆数电放到一个V流的方法里边,它也能执行成功吗?因为任务量比较小嘛,但是生长环当中一旦发生这种输入倾血更严重的情况,就这个任务死活跑成工,而且是某一个task死,对吧,就中间的某一个就跑起来。啊,那这个就有问题了,所以呢,我们要清除一下那个,呃,降低一下这个。数据倾斜啊,也不能叫清除啊,或者叫消除这个用的呃,不是特别准确,因为数据倾斜这个事情啊,你就算用了随机数也不能完全的去解决这个问题,对吧,但是让他尽量的去干什么。均匀一些,我们当时看到这个任务时间差没有什么22跟七这个差值了,对吧?哎,他们都很接近的,也就是每个任务分到的数据量呢,都差不多了,都差不多了,也就是说一定的程度上解决了这个数据倾斜的一个问题啊,解决数据倾斜的一个问题,这是我们之前所讲的,那接下来这个麦部效应对吧,还有这些属性,这些属性呢,我们是放在这个文档里边的,建议大家呀,是这样。
15:22
你遇到这些这里边我们不是提到了很多这个属性嘛,对吧,第一你可以看成这呢,你拿着这个内容复制,你进到have-pot里边,你去看一下它底下的一个describe描述它到底是起什么作用的,对吧,你去看一下,如果看不懂的粘出来,百度翻译一下,或者谷歌翻译一下啊去看一下。啊,理解一下意思,然后接下来把这些属性呢,整理一个战略的文档。整理一个专门的文档,因为你后来再去复习的时候。你说在在这里边一个一个的去找这些属性是不是很多方面对吧,自己把这个事情要做整理的啊,要做整理的,因为我们不给大家整理呢,是希望大家自己整理啊,因为你自己整理的东西你会记得更熟,当然这个东西我去整理一下,也费不了多长时间就把它粘出来,对吧?啊写一下希望这个事情呢,就交到你们手上,自己处理,一定要去做一下。
16:11
因为这个并不是什么难事啊,你在整理的过程当中又加深了一个印象,而且呢,整理成一个自己的资料,你自己再去找的时候,因为是你自己整理的,再去找的时候呢,就更方便一点,更方便一点。
我来说两句