00:00
现在呢,我们就来给前面创建的几张表啊,我们去插入一些数据啊,那我们先看一下这些表,呃,So tables,那我们现在是有这么几张表了,那比如说来一个非分区表啊,就最开始建的这张表,我们先insert into这张表啊,然后呢,它的表结构是啥来着啊,无所谓,咱们直接拷贝吧啊。是这张表没错啊,最后插入一条数据,对,多了一个insert that,好飞车。由于咱们没指定啊,啊,所以它的路径会是在哪呢?在这个地方啊,咱们没有指定location,没没有指定location对吧?啊,那这个时候我们就来到默认路径呗,啊这里有一个Spark y house啊,那来一个Spark y house,再看一看里面你看有一个RK忽底啊这么一个数据库的路径都是依赖于文件系统的啊好,那你看啊,咱们现在有这么几个了。
01:12
那我们是这个啊,谷底cow看一下这里面现在是不是有一个帕对吧?啊,我们一起来回顾一下,看一下云数据怎么看呢?R-AR这里能看到什么呢?点弧底啊点弧底那还有一个什么分区的云数据啊,我们说了没有指定分区字段,那整个表的路径就是大的一个分区路径啊,相当于是这样啊,就相当于说有个默认的大分区啊行嗯。好,那同样对另一张表二表,我们也去插入一下。
02:03
对吧?啊,也是执行成功的,我们来看一下数据有没有生成,就这张啊Mo你也可以直接去那个ne一下啊,你看也有怕会的了啊好行啊,这个应该都OK。另外一种就是咱们的动态分区写法,哎,我就说我我是一张分区表,但是呢,分区我不写死,分区的值不写死,哎,我只需要传一个什么呢分区字段就可以,那么回头呢,咱们大家注意了,你后面不是跟上一个SNE吗?啊,反正总而言之,跟上一个结果集最后的字段就跟分区字段匹配啊,那比如说你分区字段是两个,那么倒数第二个字段的值,那就是啊,这个DT的值,那最后的一个值就是这个HH的值啊,它是根据这个字段的顺序来对应的,这跟have的一个用法还是基本一致的啊好,那我们来尝试的,诶,我不指定分区让他去,诶不对啊,在这里让他去。
03:03
插入之后呢,咱们只需要去看一看这个。嗯。那我们先看一下这张表呗,呃,Copt t VR是哪张表来着?进了太多copt t t2。这张表是吧。看确认一下啊PTTPR啊行,那就这个,我们先看一下这里有没有。呃,不在这啊,因为我们当时建表时候指定一个什么location啊,指定一个location,好,那既然指定了location,我们就去在这看呗,我再拷贝一个窗口出来。
04:01
哦,这个是HDFS路径了,现在就是。那这样的话,我的哈杜我看起了没有。哈,豆瓣是起的啊。那么啊,这里有啊。来到跟路径,看看咱们指定的那个TNP,哎,然后有个护底啊,然后你看这张表是不是现在就有了,它不存在,就会自动帮我们创建,诶点进来诶发现了,诶它自动在这个表路径下面生成了一个呃分区路径啊,就咱们是动态插入的嘛。啊,还有原数据对吧,这里面呢,还有第二层分区HH啊还有呢,诶这里就是一个怕的文件了啊。好,这个就是像分区呃,动态插入啊,动态分区插入这个可以说应该是特别常用特别好用啊,另外一种就是往写死的分区去做一个插入操作啊,就还是同样的表,咱们在银色的时候指定塔金水为具体的值,那这样的话就是一个指定分区的插入了,我们也是快速执行一下啊,这些语法都跟have或者说Spark circle的语法啊。
05:18
如果你要指定为本地文件系统啊,就比如说咱们创建表的时候,这个地方,呃,你没有加协议,默认就是HDFS是吧,如果你要本地的话,你应该是这么写啊,Fire啊对吧?啊这样来写,那就这就是一个本地的,好,那完事之后我们只需要确认什么,刚才是不是只有一个十这么一个分区,我们看看有没有生成新的分区啊。你看现在是不是生成了一个幺幺的这个二级分区啊,这里面也有数据了。啊,这个就是一些插入啊,另外一个就单独介绍一个我们的这个b insert批量导入这么一种插入方式,这种一般是用来做一个呃,历史数据的初始化啊,举个例子啊,呃,你现在呢,有大量的数据,有比如说有1亿条历史数据,现在你们要开始上数据湖了啊,要上湖底了,要数据入湖了,那这个时候呢,我建议说历史数据的导入就用这种方式啊,报insert。
06:20
啊,那要用它呢,其实就是。嗯。开启两个配置,第一个呢,就是这个。第二个呢,就指定为插入模式为非严格模式啊,非严格模式。来,我们先来。执行一下,比如说MO2这张表,我们再插入一条数据啊。这个时候呃,我们都不去指定这个参数,对吧,还没指定,这个时候默认为什么upset啊,我就是插入库更新啊,插入库更新我们先查一下这张表啊。之前呢,我们是插入过一条数据,是不是啊,1A121A120,那现在相当于说我要把A1的名字改为A1下划线一啊这样子。
07:11
好,先插入。好,完事之后呢,我们再来查询那个隐藏字段,咱们就不看了,对吧,我们只要看它的结果值,哎,你看这个name是不是从原先的看在哪个地方,原先的A1现在变成了A1下划线一了啊,这就实现了一个更新的效果嘛,这个TS也被我们更新掉了嘛,对吧,那我们说我们指定了那个。Pre combine预合并字段,如果咱们的record key相同,它就会取预合并字段值大的那条数据,对吧?那我们指定的ID为什么呢?ID就是咱们的record key啊,都是一啊,然后呢,这个TS大的就是这个1001啊,就取它,这就实现了一个更新覆盖的效果。
08:06
行。那我们要用报银色的,注意啊,要求你这张表指定的域合并的key啊才可以啊,要不然会报错的啊。呃,数据也会不准确,这样的话就可以保证一个数据的一致性的,插入的时候好,那么先把这两个参数给开启一下啊,我们set的方式让它临时生效啊就OK了啊下载一下。好,现在已经是触跟非严格了,开启之后呢,咱们再去插入,大家可以看一下啊。我再插入相当于说嗯,这个内又变了,TS呢是1002啊,也就看一下它的方式会是什么。来,我们再查询一遍,这个时候你会发现,诶,居然有相同ID唯一的存在,也就是说它并没有执行upset,我们这张表是有预合并字段的,但是没有执行set,如果是前面这种up的效果,大家也看到它是不是直接覆盖掉更新掉啊,对吧?那现在是批量导入的话就不会了啊,它就会把这条新的数据也插入进来而已啊而已。
09:34
好,那接下来查询就不用讲了,查询就是一个select语法就可以了啊,那这个我们。其实我们已经执行过select了啊,所以这个没什么好演示的啊,这个大家都会啊,谁都会啊,那么查询这里呢,我们需要单独来强调一下时间旅行,那么在渲染方式当中我们已经试过了,那么接下来我们用搜狗方式来实现啊,那注意版本要求hold顶是要0.9以上,另外Spark你要搜方式要求3.2以上,要不然搜方式是不支持的。
10:08
那么为了避免前面的影响呢,咱们不是开了一个b in色的吗?对吧?呃,那这个地方我们先把它关掉,把它制成一个false,那那个非严格模式还是保持非严格就可以了啊,其他不动。那我们再建一张新的表啊啊,这个什么表一对吧,字段还是这几个啊,ID name tsdt,还有HH分区呢,咱们还是以两个字段分区啊,路径呢也指定一下,呃,Cow,呃,组件ID域合并字段TS啊就这样子,跟前面建表基本一样啊啊为了不干扰我们再建一张新的。建完之后呢,咱们开始插入数据了啊,先插入这么一条简单的数据啊,1ID为一,Name为A0 TS为1000啊后面是两个分区字段,好插入完咱们再现查嘛。
11:17
好,现在说没找到,他会去给我们创建的。好。我们查询一下。数据呢,缩小一点啊,数据现在是进来了,你看ID name ts还有两个分区,好,那接下来我们对它进行修改,现在我们是upset模式,对不对啊,那这个时候ID,呃,组件相同,那就会取域合并字段值大的这一条,也就是它也就可以将A1更新A0更新成了A1啊,你看后面这个分区一样的啊,一样的。好,作为一个更新操作。
12:01
好,更新完之后,我直接上方查询。那我们缩小一点,看一下这个值已经变了,对不对啊,已经从A0变成了A1 OK。也就是说现在进行的两次的commit,那现在呢,我们要基于第一次这个时候做一个时间旅行,怎么写呢。呃,这么写啊,就是你正常的查询加上一个什么语法呢,Time stand time stand as of as of of什么什么东西呢,当时的那个instant time,那我们刚才查过是有的,对吧,当时的时间是这个啊,第二次提交的时间是这个。那么就指定时间旅行到这个时候啊去查,如果查出来是A01000,那就说明就是没毛病了,对吧?啊,那当然这边的写法有几种啊几种,呃,一个是写完整的时间,戳年月日十分秒毫秒。
13:04
另外一个呢,是写一个日期date格式的啊,有有连接符的这种啊也可以,再有一个呢,你只写到日表示从00:00开始啊,那我们现在用就用第一种呗,那这个时间戳我们就从刚才查询的A0啊,对应的这个commit time来就可以了,好拷贝。那这边注意加一个单引号,单引号。好,行,来回车来,注意看我们查出来的是什么,A0。是吧,哎,我们把它的历史状态给查出来了,如果你不加这个,那查出来就是最新的A1了,这个就是时间旅行,这应该说还是比较好用啊,可以查询多版本。好,这个是实践旅行啊。
我来说两句