00:00
好,那个练习呢,咱们就放到后面啊呃,完了之后呢,当然明天啊,首先肯定要把我们讲的东西呢去敲一敲,呃,要做的事情还是蛮多的啊呃,当然这个你可以先放一放,如果说有时间可以把这个11章去练一练,因为后面两章是关于压缩还有优化了,就是我们的应用都讲完了,对吧?应用都讲完了,这块呢,可以去练一练,包括咱们当时说的资料里边是还有一个课后练习,还有三道题啊啊,可以尝试的去做一做啊,尝试做一做啊行,那我们继续啊,接下来呢,是自定义函数,因为我们刚才已经介绍了有很多很多的函数了。是,但是内置函数我们看到有289个,嗯,总有这个内置函数解决不了的事情,那咱们就涉及到要自定义函数了,对吧?那自定义函数呢,主要有三种啊,其实在生长环境当中用的比较多的还是udf和UDTF这两个用的多一些啊,聚合函数基本上它提供的功能呢,都已经都够了啊,它所提供的sum啊,Count啊,Me啊,啊包括那个connect set connect list,对吧,你要聚合出一个结果,还是说把原始数据保留着啊,都有啊这个函数,这是我们之前说的这三类对吧?那其实这三类都可以去自定义啊,啊,那更多的呢,还是udf,跟UDTF,所以呢,我们主要看一下它们俩啊,它的步骤呢,就是说你首先要继承这个类完之后呢,实现当中的一个方法,然后呢,在命令行当中去创建函数,创建函数呢,把价包添加进来,然后去创建函数,可以创建那个这个是可选项对吧?Temp。
01:39
临时的啊,就窗口关了,你要再想用的话,就得再创建一次,那如果不写它永久函数一直可以用的,对吧?啊是这样的关系,好,那我们先来看一下自定义u.F函数,呃,我们就实现一个简单的功能,实现这个,其实这个函数已经有了返回次符串的长度,刚才我们是不是聊到了对吧?啊,就用的是lets的一个函数嘛,对吧?那我们可以自定义来实现这样的一个功能,对吧?好,那首先呢,要打开重要打开代码,好久都不写代码,是一个月没写代码了,不是你哈多我才学多长时间K不还写代码呀,你怎么就一个月没写代码了呢?暴露了啊,我当时还说代码要敲三遍,完了之后你说一个月都没写代码就一遍都不敲吧,现在是就看一看是吧?
02:39
还有就是大家的虚拟机最好是改成四个G啊,因为往后学你装的东西越来越多,你两个G肯定不够用了,就目前到现在为止执行一些S课,有的同学就暴露出来说这个资源不足了。对吧,当然你可以把那个虚拟内存检查给他干什么,关掉对吧,两个指挥force这个东西是因为老师应该跟他讲过,对吧?嗯,可以关掉,但是如果说真的一义资源。
03:07
要求上来了,你关那个检查也没用啊,他还是会报那个资源不足,所以最好调四个G啊,你们的电脑是多少内存16,那就是三个四是没问题的,我我就给了三个四,其实其实我也是16G。行,那我们再创建一个项目啊,这块呢,我们去写一下这个紫付项目啊,之前反正大家都单独的一个项目是吧,紫付工程知道我ID是配的是两个G,所以说这个我我每台ID会比较慢,默认的好像是750兆,就是说如果没改的话,ID你打开的话,它会用750兆,最高有这么多内存,我是改成了两个G啊,所以说总共16个G,我虚拟机用了四个G了,不是12个G了,这了三台,然后呢再用。
04:06
就会有稍微有一点点,就是刚打开的时候会有点卡,但整体还好,因为我是给虚拟机放到这个固态的,呃,0821是吧,就那个。我的版本还用的一七呢啊,比较稳定啊,就是大家我看到有的同学用的一九或者说二零,那这个其实会多少少有一些bug啊,还要这个工具啊,你们现在敲代码还比较少,还没有遇到bug,你往后面就能遇到了,比如说是吧?啊就是有时候是妹问的问题啊,你的妹问呢,有时候导了依赖它识别不了啊等等的都有可能会出现啊呃,那接下来呢,我们既然要建这个子付项目,所以说这个负项目当中呢,我们是不写代码的,我把这个SC目录给他干什么删掉对吧。
05:10
在大南山就行了,然后接下来呢,我们在这里边去创建一个模块,我们该说哈多当中有比较核心的几个模块,就是你们所讲的过程当中几个核心的有几个模块,四个是吧,IDFS6雅安common对吧,工具啊工具类的啊行,那这个呢,我们叫have DEMO。再建一个项目下好finish,然后我们导一下它的一个依赖,让他让他自动导入啊,等我依赖写的时候啊,那其实子浮项目它主要是干什么用的呢。就是负项目,这不是副项目的泡文件吗?他是干嘛用的,它是用来管理咱们这个依赖的版本的,对吧?那假如说你比如说我在这这是project负项目当中对吧,如我这地方呢,主要有两个标签,大家需要去关注一下,一个是depend,如果说我在这里边去写一个哈度吧,可能大家比较熟的什么IDF之前经常导的对吧,3.1.3啊,我写在负项目当中的一个依赖子项目当中,Have里边我是不是没有引入任何东西,但是这个时候。
06:36
对于我们子项目来说,他是不是就赢了对吧,还有一个还有一个标签需要去关注一下啊来depends哎不是这个应该是不是这个标签,还是这个标签就出错了吧,还有一个呢,就很烦啊,啊叫。啊,那这个呢,我们写一个注释啊,这个叫。
07:02
声明并引入啊,所谓声明并引入呢,就所有子模块都会自动引入该一的。就是说一些公用的,假如说你知道所有子模块都要用的,比如说log附件打印日志的,是不是你所有的模块都可能会用到打印日志,那我们就直接定义在depend里边,其他子模块就不需要再去定义了,而且版本就统一了,你如果单个引的时候,是不是有可能版本不统一啊,那兼容性就有问题了,对吧。好,这个标签呢叫声明,对不引入一赖,那可人可能想这个干什么用呢,那我们试一下啊来呃,这里面呢,还得写这个,然后呢,我们放一个,我放什么呢哈杜。
08:03
啊哈,呃,我们刷新。此时这个have DEMO里边有哈come吗?没有,但这里面其实能够干什么?也看不到对吧,那接下来呢,我们如果要引,我们说一下这个东西啊,生命不引不引入此模块,如果要要用这个还的话,那需要单独引入,但是引入的时候呢,你会发现一个不同点来哈多宝。看一下少了什么东西版本对吧,那我们再点开这个来刷新啊,这个是不是有3.1.3呀,对吧,也就是说。那就搞清楚这两个东西怎么用的,这个呢是放的,这里边放的依赖就是所有子模块都需要的,而这里边放的呢,就可能有部分需要,对吧,我也没必要放在这里边,就放在这个里边,就给所有人都引入这个也没必要,对吧,那我们就要放在这里边,然后呢,此模块要用的时候呢,自己去申明一下。
09:10
但是不需要版本,那这个还是一样的控制版本吧,你子模块引入的时候不写版本,那版本大家是不是统一用的是副模块里边的3.1.3呀,对吧?啊是做这个事的,这就子付模块它这个作用,它是管理这个依赖的啊,同时子付项目呢,除了管理依赖,它还能做一个事情,就是大家知道打包,一般的我们可能想打他的话,就直接点开它,在这儿对他单独的进行打包吧,对吧?那如果是一个子付项目,我们可以直接对谁啊,对负模块直接进行打包,他会把子模块自动全部打包啊,就管理依赖的啊,这负项目做这个事了,这是一个说明啊,我就放在这啊,其实我们也用不到这两个东西,对吧?呃,那接下来have当中呢,我们也就不引它了啊,我换一个我们肯定要引的是have的依赖吧,对吧,要写have的代码啊,那我们呢,叫have asec,然后呢,这个3.1.2,咱们是这个版本啊。
10:09
版本要对应就好了,让他去加载一下啊,现在网速好了,大家依赖也还好,到时候我这样吧,嗯,课下的时候我把我的仓库呢,我啊你们有是吗?啊,那行是谁给的,他给的,他给的可能少一点吧,嗯,弗Li它应该是没有的,无所谓啊,你就用那个也行啊,你就用那个吧,弗Li到时候你自己下一下,因为我是之前说过所有课都讲过,所以说依赖比较全啊,呃,但是现在网速提了,就是说你自己去下一下也还好,对吧,也不是特别慢啊,行,那我们这个就搞定,搞定好以后呢,我们就写咱们那个代码啊,我们写一个com点的硅谷点我叫u.F吧,点my udf啊就取这个类的名。
11:10
然后我们刚才看到他需要继承什么东西啊。JEUDF啊JAUDF,然后你注意导包的时候注意一下就好了。呃,有点卡啊导包哎,这里面只有一个对吧,那我们就不用管了,如果多个你得选什么have啊,Have下的啊,然后呢,实现方法对吧,告诉大家回车就好了。呃,这里面呢有三个方法,第一个呢是初始化,第二个呢叫E计算的啊,这里边呢是会将我们数据给它放进来,最后一个叫get display string啊这个东西呢,现在我们先不聊啊,我们就返回一个空就好了,它是干什么事的呢?我们点进去看一下这个方法对吧?我们去搜一下啊。
12:02
考察看到没?他说获取这个一个字符串,刚才确实这个方法返回值是一个字符串,对吧?在什么时候用呢?在X plan的时候用这个东西是我们后面讲优化的时候要提到的,它是用来看你这个circle整个的执行计划的,就是你circle最后不翻译成吗?对吧?MR怎么走的,第一,第一个MR读哪些数据,写出哪些数据,第二个MR又读哪些数据,写出哪些数据,中间用谁做P。用谁做value啊,它会打印出来,就比如说啊,这样就是它会有一个这样的东西flag,然后呢,我们select可能有一个count心,或者说这样吧,假如说加一个name。对吧,嗯,From这个business,然后呢,Group by name,哎,错了啊,这个东西也是找不到这个字段了,对吧,我们刚才准备选分号啊,走一下,它会把这个执行计划就做这个时候的啊,它里边呢分为两个阶段,第一个阶段呢,是这个什么根阶段,就最早的,那在这根阶段里边做了什么事呢?他其实就是去fetch,所谓的fetch是什么抓取操作,就第一次呢,他先要把数据干什么读进来,对吧,第二个看啊,他说这个零,这个零依赖于第一个阶段,你先读数据,我才能做计算法,那这个里边呢,就有这个东西来看啊,是一个什么,是一个麦,因为那康新这肯定会走任务吧,对吧,是一个MAP6完之后呢,看这。
13:45
Map操作。还有V输出对吧,整个操作那这里面呢,就有,哎,我们有group操作P是什么。Name,因为刚才我们写的group back嘛,Name的其实就是把name放在K的位置,然后求count新,不就是求what count嘛,对吧?啊,这个是详细的执行计划,也就是说当前咱们这个方法呢,是给执行计划用的,咱们自定义的函数啊,一般很少写这个执行计划,一般我们都给个空就好了啊,知道这个干什么用的,一般就给空了,就不用去输出什么东西了,那这第一个初始化方法,那明显的肯定是初始化方法先走了。
14:24
对吧,然后这个呢,Evaluate就进来一条数据我计算一次,进来一条数据计算一次,而它是全局的,干什么执行一次初始化嘛,就类似于在这个当中大家经常遇到的setup map cleanup,这样setup是执行一次,而map是进来一条数据执行一次,进来一条数据执行一次,一样的啊,一样的啊,好,这个呢,一般的我们是用来校验。数据参数个数啊,或者说类型啊等等这些东西都可以啊,就校验参数的个数类型,那我们这个函数将来是干什么事啊,输入一个字符串,返回字符串长度,刚才我们说了要做这个事儿,对吧?所以呢,那输入我们刚才说一个字符串,那我们校验长度如果不等于一,就直接报错呗。
15:13
对吧,好,那我们到这来判断一下啊,啊,这里边一般是作业校验if,这不是arguments的一个数组嘛,对吧?我判断argument的一个色如果不等于一,我们可以直接用一个so,直接抛一个什么,抛一个异常出去啊。啊,小写走,然后你有一个这个,呃,他能允许抛的异常,是不是u.F的一个异常啊,然后这里面我们写一个东西啊,嗯,参数不对对吧,嗯,参数个数不为一啊。就不对啊对吧,好,那接下来呢,正常的你还可以校验它这个类型啊,校验其他内容,那关键的问题在于这它这个返回值是什么东西啊,是一个object inspector,这是一个校验器啊,就是类型的一个校验器,一般的这块东西呢,你需要去记一下啊,一般我们返回呢,就是。
16:18
这个东西比较麻烦一点啊,发个对啊,嗯,就气的一个工厂类吗?这个刚才我说了,你要去记一下,当然你不记得也可以,我们可以怎么做啊,点这个,然后他肯定有很多的一个什么。实现嗯,你看啊,这不是Apple这个函数吗?对吧?啊,那这里边你都能找得到啊,就是说函数它自己都是这样定义的是吧,我们用过的,嗯,你包括还有看还有什么东西能认识啊Les对吧?让函数你随便找一个你能认识的,然后就看一下它怎么写的,然后最后呢,把它的反馈值拿过来不就好了。对吧,啊拿过来,那我们这边呢,就我们写一下啊,这个就比较麻烦,就是你需要去记一下,也不用记啊,就是说还是一样的整理到自己的什么。
17:07
笔记里边,那这个返回值我们是什么类型。刚才我们说这个函数输入一个字符串返回值用。返回它的length对吧,所以我们用int类型对吧,那就Java我们选这个。哎,那我们找一下。我们,哎,这是第一个对吧?啊,用int就好了啊,直接返回这个int,当然了,校验一下长度,一般我们自己输的时候就输一个就行了,就类似于呃,人家函数说只能输一个参数,你非得输两个,它是不是直接不让你过啊啊就在这一块就给你跑异常了,对吧?啊就类似于这样的事情啊,这就是定义校验参数个校验类型,校验参数的啊校验参数的当然你不写说直接返回这个也可以啊,也可以,只不过说呢,你最后这个函数不太方便用了啊好,那更关键的是当前这个方法处理什么处理数据的方法。
18:08
处理数据的方法,那一样的,它进来的数据呢,它还是一个什么数组,因为我们看到我们有很多的函数,有的函数是不是只有一个参数,有的函数呢两个,有的甚至还是可变应参,是不是说明我们正常的一个udf函数允许。多个参数啊,对吧,那我们只有一个,那怎么搞呢?我们是不是要把这个参数输入参数取出来对吧,取出输入数据,那这个数组我们怎么取啊,零而且呢,它这个类型对吧?它封装了have当中就类似于int,你看它不叫它这里它都是封装的一个类型,因为它中间要做校验,我们是不是希望得到一个string,直接干什么to string就好了,这个东西呢,我们叫input,好叫input,那接下来第二步我们是不是就返回这个input,这个长度,正常来说我们直接返回input点么?
19:09
Length,对吧,但是你要想一个问题啊,在生长环境当中,我们这个input,我们的整个数据集当中是不是可能会有none?有纳值啊,那如果说真的输入是一个纳值,你这块就怎么样。什么异常,控制针异常吗?你拿个那去调方法,那不就控制针异常了吗?对吧,所以呢,在这我们校验一下防止为空对吧?哎,这个就差二了呢一啊第二个判断输入数据是否为什么,那对吧,如果为那我们就返回一个零就好了呗。对吧啊,如果为我们返回一个零就好了,If这个input说等等于什么,那我们就直接一个什么零对吧,走了,如果不为呢,我们就才是返回它什么长度,这样是不是从安全性的角度来说更好一点,对吧啊。
20:12
这第三步返回输入数据的长度。对吧,啊,它长度这个就搞定了啊,就搞定了,前面呢,就是说要返回写一下它的一个类型啊,用int类型对吧,最后呢,这个let返回的也是它的一个定的类型啊前面呢,只要说呢,我们从安全的角度呢来。做了一个校验啊,防止输入为捺,输入为纳,最后你用的时候肯定就控制针了,对吧,这个时候呢,它就返回一个零啊,它也不空啊行,这个是编写咱们的一个udf函数。
我来说两句