00:00
呃,好了,各位同学,那就是我们刚才提到了,就是我们需要去建一张表,这个表的字段要跟那个阶森字符串的字段映射上才行,对吧?就这样的表到底怎么建,咱之前没学过,那我们现在得去哪看一下呢?得去have的官网上看一下,对吧?那所以咱接下来呢,就打开这个have的官网,我们搜一下这个have啊啊完之后呢,进到have官网,进到have网之后呢,咱们找谁啊,那现在我们就不要再找这个getting started的guide了,一般这个快速开始里边只有什么东西啊,只有一些安装啊,是不是等等这样一些步骤,对吧?那你要找使用,咱们这找谁呢?找左边那个document里边的language menu是不是语法手册呀,对吧?因为你现在要干啥,是不是要建表啊,对吧?建表是不是得看这个相应的语法是什么样的,对吧,咱们找到language menu,然后里边呢,咱们找谁。里边有各种各样的这种这种这个这个语法对不对?那咱找谁啊,我要建表,建表咱得找这个DDL这个类啊,对吧?好,那现在咱们点一下这个DDL,点完之后这里边东西非常多,就是你怎样建表对吧?怎样删表,怎样建库等等的是不是都有啊对吧?那当然在这咱们得找谁呢?咱得找与杰森相关的内容对吧?你就直接搜这个杰森就行了,然后呢,咱们往下走,往下走找到这个位置啊,OK,那这儿实际上呢,就给我们列出来了,就这种所谓的这种,咱们就管它叫做杰森表了啊,就说OK,我这个表如果下边存的是杰S字符串,然后呢,表的字段跟杰森的字段能够映衬上,那在这咱给它起个名字,我们就管它叫做阶森表啊,OK,那这就给咱列出来的这种接分表的见表语句的语法,OK,那我们看一看右边这个位置,咱们看这儿啊,实际上右边呢,给我们列出来了,就是have当中不同的版本所支持的这个积分表的这个语法,OK,那我们一个一个来看啊,首先看这下边这个是多多哪个版本能用的呀,是0.12。
01:44
版本之后可以用的对吧,是哪个是这个诶0.12的版本,0.10.12之后的版本用这个,那0.12之前呢。没有这个不支持对吧?OK,那咱就不管了,往下走往下走,OK,那这儿其实还有一小节,那这个是什么呢?这个咱们看一眼啊,这是在哪个版本,是在3.0之后,对吧?是不是可以用这样的一个这个语法呀,对吧,然后再往下又有新的语法,这是哪个语法,是在4.0以后,是不是能有这样的一个语法呀,对吧?所以所以它不同的版本语法是不太一样的,它不它不断的变化,不断升级啊那咱这是不是应该是用3.0以后的,应该是用这个呀,对吧?好OK,那所以接下来呢,咱们就把这一部分关键的内容给它复制出来,咱看一下这个东西到底怎么去建啊,来拿过来,拿了之后呢,诶,我给它放在这个位置吧,R位稍微调小一点啊好了,那这就是咱们这个所谓的接森表的这个键本的语法,来,咱们现在诶一行一行来看一下啊,其实前面第一行大家应该很熟悉,Create table,然后表名是不是字段名,字段类型那就完事了,对吧,比较简单,咱们看第二行,第二行呢是什么?
02:48
其实前半部分大家也熟悉roat,对吧,之前咱在学have的时候,你是不是建每张表的时候都要去声明一个所谓的RO forat呀,对吧?之前大家那个RO format是怎么声明的,是不是RO forat de limited,然后feels terminated by一个风格腐吧,对吧,OK,那实际上你之前那是在干啥呢?就是在声明我这个RORO是啥,是行的格式对吧,实际上你就是在告诉have OK,那我的行的格式是什么呢?Limited是通过一个特定的分隔符分隔的,对吧?OK,啊,好,那完之后你会告诉他我的fields term,也就是字段是由是不是某个分隔符分隔的呀,对吧?那这样一来have就知道了,OK,你这个文件里边,你这个每行数据它是用一个特定的分隔符分隔的,那将来have去读你这一行一行的数据的时候,我甚至能够根据分隔符把你这个一行数据给你列开呀,对吧,列开之后它是不是就能够去拿一个一个字字段了呀,对吧?是这样的,那这样一来是不是have就能够解析你这个表下面的这种分隔符的文件了。
03:49
对不对,OK,那之前那那个行格式都是这么声明的,但是你注意这种杰森文件,OK,那咱们还用那种方式去声明吗?就不能用了,对吧,你看后边是什么。
04:00
Ser de,然后后面呢,又指向了一个什么接算ser de的一个全类名对吧?OK,那这个ser de是什么?大家之前可能是没有接触过的对吧?呃,在这呢,我先简单给大家说一下啊,Ser de的实际上是两个单词,哎,他们的一个拼接ser指的是什么呢?是sizer,是序列化器对吧?那de是什么呢?反过来呗,DC letter对吧,也就是反序列会叫解序列化器,对不对,是这样的啊,OK,那也就是在这呢,我们声明的这个类就是一个杰森字符串的序列化和反修加器,OK,那这个东西到底是干啥用的对不对?这个我一会儿再给大家详细的解释,那现在呢,咱们先大概有一个了解就行了,你就只需要知道这个东西是用来解析我们这个文件当中的是不是一行一行的这个阶森字符串的呀,对吧?诶是这样的啊好嘞,那这个咱们先大概的了解一下,那接下来我们继续往进,其实说实话啊,大家就是不知道这个东西是啥,其实也不影响咱们去见表,对吧?啊是这样的,但是一会儿呢,我我我会给大家去解释的啊来继续往下走,那我们再来看最后一行,这个大家应该也比较熟悉吧,Start as t file,这是在声明什么呢?声明咱们这个文件的格式是文本文件对吧?那当然我也可以是什么类型的文件。
05:11
比如说orc文件是不是也是可以的,对吧,这一点咱们稍微的理解一下,OK,那当然呢,呃,这这一行我可以不写,可不可以不写呢。可不可以可以不写,如果不写的话,默认就是。其实默认就是text file对吧,是这样的,所以最简单的一个写法就是这么去写,OK啊好了,那到目前为止呢,这个所谓的杰森表。那它的这个间隔的语句语法基本上咱们就过了一下了啊,那接下来呢,我给大家详细去解释一下这个所谓的s de到底是什么,实际上汉的官网上就有相应的说明啊来,我们还打开这个页面,你往上翻来走。往上,诶在这儿你看这儿是不是就给咱们列出来的这个ser de这个概念了,对吧?OK,那这儿呢,就会有一个所谓的have s,那咱现在就给它点进去看一看这个东西到底是啥东西啊来,我把这个字调大一点,咱们一起看一下啊呃,这个太大了,来看这那这说了说什么是s SE de,对吧?那这就已经给出了说明,他说s de呢,是一个short name是不是就是简写呀,对吧,然后for谁for s and d,是不是就刚才咱们提到的序列化和反修器啊,对吧?好,那接下来往下走,那氦到底使用这个所谓的serd干什么呢?来往下走,这已经给出了说明了,来看。
06:24
他说have呢,使用serve去干啥?去读和写have表当中的是不是每行数据啊,对吧?诶是这样的啊,OK,好,那haveve到底是如何去使用这个ser de去读写have表当中每行数据呢?我到底什么时候用到的这个s de呢?对吧?那接下来咱们去看一下,你要想知道他怎么用,知道什么时候用,那咱是不是得熟悉这个have去读一张表的数据和写一张表数据这个流程啊,对吧?好,那接下来咱们就逐个的来看一下,我们先来看一下have从一张表里边儿去读数据的流程啊,好读是怎么读呢?
07:01
首先咱们得这其实就是它的一个读流程,首先咱得知道啊,就是hi,我去读数据,我的起点在哪对吧?我从HAVE1张表里对吧?去读数据,我的起点在哪?起点是不是应该是H加一个文件,每张表的数据是不是最终都是在H加上一个文件呀,对吧?那所以说我的起点其实说白了就是读HDFS的文件,好,那完了之后你看我读文件,我用什么读的呢?Have,这边呢,是使用input,诶,For麦去读的,这个input for麦大家应该不陌不陌生吧,应该不陌生吧,那咱们之前在去学习这个,呃,Hi map6的时候,对吧?那咱们是不是也要去读HM文件对吧?当时读是不是就是用input form去读的对不对?OK,那这儿也是一样的道理,好,那大家再回忆一下input for读到的这个数据都是什么样的结构来着,KV限值论的一个结构对吧?OK,这个K通常默认是什么来着,是文件里边的一个行号对吧?那完之后这个Y6是不是就是你一行的值啊,对吧?那当然咱这儿也不例外,它读到的仍然是这样的一个K和Y6的样一个结构。好,那完了之后,后边这个所谓的序列化和反序量化器他就要登场了,OK,你要知道你读到这个Y6,其实说白了,如果你读的是文本文件,那你这个Y6其实这就是个是不是就是一个一个字符串啊,对吧?OK,那一个字符串二,那我在还有当中,我有办法去对这个数据进行分析,去进行计算吗?没有对吧?那怎样才能分析计算呢?哎,它需要将其最终转化成一个什么。
08:22
一个行对象,哎,转成一个行对象之后,那我是不是就有了这个对象的一些方法等等,是不是就可以对数据进行分析了呀,对吧,是这样的,OK,那所以在这边呢,怎样能够把一个字符串,我给它转成一个所谓的对象啊,那这个操作是不是就咱们常说的这个反序列化的一个过程啊,对吧,OK,把一个字符串对吧,最终我给它反修化成了一个咱们想要的这个行对象,OK,那这实际上呢,就是说have从表里边去读数据的一个完整的过程,那这个所谓的反修化器就是在这个位置被用到的,诶这一点要理解一下,好,那我们每行数据最终是不是都会对应一个roll object呀,对吧?那完之后再对它进行相应的分析统计等等等等,这是读的过程,好,那读完之后我们继往上走,处理完之后,最终是不是还有可能会把数据写到一张表里啊,对吧?好,那写的过程是什么样的呢?来看一下。
09:11
这是写的流程,那那写我的起点现在是不是应该是JVM当中的一个roll object呀,对吧?好,那完之后最终我需要先干啥呢?是不是先给它去掉成一个KV建筑,对对不对,那之后呢,再怎么样,是不是再使用outut form,把数据是不是写到HDL文件啊,对吧?OK,那这个时间呢,就是我们哎去干啥呢?去读和写这个数据的一个完整的流程,OK啊,好,那完了之后里边就用到了咱们这看到的sizer和dializer,那其实你注意观察,除了civilializer和dialize啊,我们其实还用到了什么呢?就是input format和output format,对吧,是这样的啊,但是大家可能现在会有一个疑问啊,什么疑问呢?就是说我之前对吧,我在去学have的时候,我在建表的过程当中,我也没有显示的去声明我的input form是什么,Output form是什么,我在序列化是什么,我的反修,我是不是之前都没有显示的去明啊,对不对,那我之前我那个建的这张表对吧?它去读和写数据的时候,那他用的in input for是什么out。
10:12
序列化和反应是什么,那这个到底怎么回事呢?我之前我也没有显示的声明呢,对不对,没有声明,那他用的是什么呢。这个大家可能就会有疑问了,对吧?哎,但其实我可以明确的告诉大家啊,咱们之前呢,只是没有显示的声明,但是呢,实际上呢,每张表你建好之后,它都会有一个input form和out,都会有一个序列化器和反细化器,只是咱们之前没有显示的生命啊,为什么是这样的呢?来,我们其实可以往下看,你往下走,各位同学。来最底下你看左边是咱们大家比较熟悉的这个键表语句当中的语法,对吧,是什么死刀的as什么东西对不对,这些来是不是都是这么去声明啊,对吧?但其实你会发现你这么去声明就和什么是等价的呢?和后边你这样去声明是等价的,你看这里边是不是都会有RO ma,是不是s ER de啊对吧,然后还会有input和output,其实咱们大家呢,前面用的都是一个简化的语法啊,你这么写根你诶写这种完整的语法,它是等价的啊这样的啊,这一点咱们大家要稍微的理解一下啊,其实在那儿,我在哪儿,我们也能去验证这一点呢,大家还记不记得我们前天再去搭建那个呃汉王SPA环境的时候,我建了一个s student顿的表,对吧?大家记得我那个S顿的表,我当时怎么写的建筑语句的吗?我是不是就直接C瑞table,然后后边俩字的后边啥都没写对吧,没问题吧,然后呢,咱们现在来看一下那个表的完整的键面语句啊,在这你可以执行一个show table,呃,后边是不是加上一个表名,就能看它的一个完整的面语句啊,对吧?OK,那诸观察我那个是在deful。
11:46
里边啊,那我当前是不是位于jama啊,对吧,所以需要加上一个default啊,来下一个student,然后呢,咱们各位同学一起来看一下它当前的介面语句,我这个have特度刚才已经提前启动起来了啊,然后呢,在这边呢,咱们能连上注意观察大家。之前咱建表的时候,我其实就只写到这儿,对吧?但是你会发现它是不是自动的给我们填上了后边这些内容啊,对吧?OK,你看这里边有啥,是不是就是roll format ER对不对?是不是就是input for,还有out form呀,对吧?那当然这些东西目前用的都是它的默认值啊,都是默认诶这一点大家要稍微的理解一下啊,好,有同学,那也就是截止到现在呢,大家应该就已经知道了这个所谓的ER de是什么了,那实际上呢,每一张have的表都会有一个ER啊,都会有input和output form对吧?这仨东西呢,大家之前不知道,是因为之前我们没有显示的灵,我们用的是它那个简化的语法对吧?但实际上呢,大家应该得知道,每一张表都会有这样的三个要素啊,这个一定得搞清楚啊,行了,那完成之后呢,我把这个视频停一下,那截止到现在就是这个语法,大家应该基本上熟悉了啊来视频我停一下。
12:54
行,各位同学语法熟悉了,那接下来呢,咱们就把它CTRLC给它复制过来,然后我们测一测,就是这种表,咱到底怎么去诶怎么去玩啊,来拿过来啊,拿来之后咱接下来要想玩的话,是不是肯定得做一个测试啊,对吧,就是我们得自己亲自的去建一张这样的表,然后去看一看这个表到底怎么用,对吧?好了,拿完之后大家来琢磨琢磨,就是这种表,那它存在的意义,大家说就是干什么用的。
13:16
它存在的意义是不是就是为了解析那个杰森文件,解析杰森字块的呀,对吧?那所以说我们这种表你怎么去建,是由什么决定的,是不是应该是由你将来要往这张表里边导的那个接森文件决定啊对吧,那个接森文件啥样是不是就会导致我这个表设计成什么样,对吧?好,那接下来呢,咱们假定啊,将来我就会往这张表里导入这样的一个字符,咱们来一个简单点的啊,比如这里边呢,我就俩字段,一个是ID,那完了之后呢,我这儿来一个字段这个写一个这个,呃,比如说1001对吧,那后边呢,我再给他来一个这个,呃,对应的这个name name对吧?那完了之后咱们叫什么呢?我就叫做这个张三,OK,当然这个ID呢,咱们这来一个数字类型对吧,把这个引号去掉啊好了同学,那这就是我们将来要往这张表里边导的这个所谓的接S文件里边的字符串,好,那完之后咱们接来分析分析,你说我要想解析这样的文件,这个表咱们应该怎么接?
14:07
首先表明咱们调整一下,比如说我这来一个叫我叫P表啊,好,那完了之后是不是重点就是字段了呀,对吧?那我们现在是不是要需要去确定这个表的字段的字段个数,还有字段的类型,还有字段名啊这些东西啊对吧?好,那现在问题来怎么确定,哎,首先大家需要明确的一点就是OK,那我们的字段名,就是表的字段名一定要跟谁一致呢?跟接算文件接算字符串当中的你那个K要保持一致啊,为什么要这样呢?哎,因为这个底层的原理它是这样的啊,它实际上说白了是怎么做呢?就是将来你是不是建好了这张表之后,会把文件放在里边啊对吧?我们会从这张表里不是查这个具体的字段对吧?它底层的原理是啥样的呢?它就是会把你这个表的字段的字段名儿作为一个K值,对吧?然后呢,从这个接分文件里边去找对应的Y6。啊,是这样的啊,那所以说你是不是就得保证字段的名得跟这个K的字段这K的呃,这个值是一样的呀,对吧?那所以在这一定要保持一致,OK,那在这儿呢,我来一个ID,那后边呢,我这得来一个啥呢?是不是得来一个name嘛,对吧?好,那接下来呢,就是字段的类型,字段类型,那字段类型大家大家说我这边怎么确定,是不是根据你这个具体的阶层字符块当中值的类型确定就行了,对吧?OK,那这个ID后边是呃101,在这儿呢,我们可以给它来一个int对吧?好,那接着往下走,后边这个name是呃字符块我是不是可以来一个string啊对吧,这一点要搞清楚好了,那这个字段名字段类型都确定了,还有一点就是字段顺序。
15:34
先问一下大家,你这个字段的顺序,它重要不重要?重要不重要,哎,其实对于咱们之前就是常规的那种,就是用来解析TSV或者是CSV文件的表,你说这段顺序重要不重要,那个是重要,它为什么重要呢?因为你之前那种它是怎样去找一个一个字段的,它是不是就是根据下标,根据索引去找一个字段的呀,对吧?那所以说你那个表的字段,它的顺序必须得跟你文件里边的数据表一致,但是这种呢。
16:03
那就不是根据索引去找,我是根据对应的K值去找的,对吧?所以字段的顺序是不重要的啊,是这样的啊,这个无所谓,这一点大家搞清楚啊,行了,那现在我们这张表就算是给它,哎,这个设计好了,设计好之后呢,那接下来呢,咱们就给它创建出来,我指诶那这边我们为了一会儿方便一点啊,咱们这样我给他指定一个location,那为什么要指定location呢?因为咱们将来是不是要往这个表里边去漏的文件啊,对吧?诶咱们把这个location指定一下是不是更明确对吧?我们给它放到PSO就放在根目录下边的person这个路径下,好,那现在呢,咱们把这个表给它CTRL,呃,加回车给它创建出来好表咱现在已经有了,表有了之后咱接下来需要干啥。是不是得想办法往这个里边去漏的一张文件啊,对吧?那OK,那怎么去漏的?呃,是不是得先有一个这样的文件对吧?来,咱们现在去找一个这样的文件啊,那我给它放在哪个位置呢?我就给它放在咱们的102的加目录下边吧,那在这儿呢,我给它创建一个文件,呃,然后呢,这样我把刚才咱们写的这个字符段CTRLC咱给它拿过来,呃,拿出来之后放在这儿啊,那之后我为了更方便一点,我在这我在给他造两条数据啊,这里来一个1002,那后边呢,我再给他来一个这个李四吧,呃,李四,OK,好,那到现在咱这个文件是不是就准备好了,对吧?文件准备好之后,咱接下来干啥?
17:15
接下来咱是不是得往里边去漏了一下对吧,好,那管事我问一下大家啊,咱我在这个位置漏的行不行。我在这个位置漏的行不行,执行一个漏的语句行不行。你要知道咱现在这个文件在哪放着,是在1020那节点的本地放着,没有在HD放着对吧?OK,好,那完了之后我要去load的话,我是不是得执行一个load类load date local in pass,对吧,没问题吧?好,那问一下大家,我那个load date local语句在这儿执行行不行?那就不行了,为啥啊,Load data local指的是本地,对吧?谁的本地是你执行这个语句的时候的本地对吧?那你在这写咱们当前的本地是不是就是Windows啊,对吧?那它就不行了,诶所以说文件在哪,你这个语句就在那执行,那在那儿呢?我在102开一个have的这个窗口啊,完了之后呢,我use一下这个J数据库,咱们在这去进行这个操作啊,OK,那在这呢,我们执行一个lo,呃,这个ad load,然后data是不是啊对吧?后边跟上一个in pass,那后边呢,是不是跟上咱刚才那个文件的路径,呃,我应该是放在了home at硅谷下边,呃,是不是写了一个person文件啊,对吧?那后边我们来一个into table加谁是不是就加上咱们刚才那个所谓的坡损表,那就完事了,对吧?那我直接回车。
18:25
啊,那现在这个数据应该就已经进到这个表里了啊,但从哪也能看一下呢?我们从HDFS的根目录是不是也能找一下这个person,这是不是已经有这个文件了,对不对?OK,那接下来呢,咱们就来看一看这张表的数据咱能不能查出来,OK,那现在我执行一个select星,然后呢,From咱这个person表,OK,那咱直接回车,好来看这个数据有没有顺利的解析出来,解析出来了对吧?没有问题啊,那比如说我现在想只查某一个字段的行不行呢?Select一下啊,然后呢,比如说来一个ID,然后呢,From这个person OK,那咱试一下。走诶,你看这个单个的字段是不是也能查出来呀,对吧?OK,那这样一来的话,那咱是不是就已经实现了我们想要的那个效果了,我们就已经把这个表的字段是不是跟我们上面这个杰森字符串里边的字段是不是完成了这个对应的关系了,对不对?诶那这其实是比较方便了,好了同学,那截止到现在呢,这个杰森表咱基本上就会玩了啊来视频我给他停一下。
19:18
呃,好的各同学,那接下来咱继续往下走,那结算表基本上就是这么用啊,然后现在呢,咱需要去考虑一个异常情况,什么异常情况呢?就是咱目前看啊,我这张表的字段跟这个杰森字符串里边的字段是不是完全一致的呀,对吧?OK,那大家可以考虑一个考虑一个问题啊,什么问题呢?就是假如说我这个表的字段跟杰森字符串的字段呢,不是完全一致。啊,对吧,比如说哎,我这个,呃,健身字符串我多一个字段对不对,或者说我表要比字符串多一个字段对不对?好,那完之后你说它可能会发生什么样的情况呢?就是不一致的情况下会有什么问题,这种情况咱是不是也得考虑啊,对吧?哎,那大家想想你他会有什么样的问题。其实不会有什么问题啊,来接下来咱们测一下啊,OK,这个怎么能测出来呢?来我在这把这个103给它关了,我我打打开这个102完完之后呢,我再进到这个102啊之后呢,咱们打开这个P文件,打开之后咱们干啥啊?诶对,我给它稍微调整一下,我把这个name呢,我给他管的叫叫什么呢?叫做NAME1对不对,那这样一来是不是就能够呃去实现一个效果,什么效果,就是我当前是不是这个文件的字段跟我这个表的字段目前是不完全一致啊对吧?好,我们来看一看它不完全一致会有什么样的问题,但是我现在只是改了一下本地的文件啊,我得干啥?我说得把这个这个文件得重新往那个表里边漏了一下,对吧?OK,当然要注意现在那个表里边是不是已经有内容了,所以说我们这得怎么样。
20:40
得right一下对吧,Right into就行对吧?OOK,那直接回车好了,现在是不是就已经right了呀,对吧?好,那刷新一下。对吧,只有一个文件吧,说明已经覆盖了啊好,那现在我们再来从里边查一下这个数据,看看它是什么样的,来我们直接执行一个select星上这张表,诶你零观察,你看他他是怎么去处理这个所谓的不一致的问题的呀。
21:01
就是有的字段有我就查出来,没有我是就直接给你返回一个not就完事了,对吧?哎,其实他就是这样去处理这个,诶所谓的字段不对应的一个情况了,这一点咱们也要给他搞清楚,就是他不会报错的,诶这一点搞清楚就完事了,来视频我评一下。
我来说两句