08-表属性操作
写在前面的话:
该系列博文是我学习《 Hive源码解析与开发实战》视频课程的一个笔记,或者说总结,暂时没有对视频中的操作去做验证,只是纯粹的学习记录。
有兴趣看该视频的博友可以留言,我会共享出来,相互交流学习 ^.^。
*********************************************************************************************************
本文目录:
一、修改表名
二、修改列名
三、增加列
四、修改表属性
4.1、查看表属性
4.2、修改tblproperties属性
4.2.1、修改该属性下的comment
4.2.2、修改该属性下的extenal
4.3、修改serdeproperties属性
4.3.1、修改该属性下的field.delim
①无分区表修改;②有分区表修改;
4.4、修改location属性
本文主要讲解表的属性的操作。
一、修改表名:
alter table tablename rename to newtablename;
二、修改列名:
alter table tablename change column old_column_name new_column_name new_column_type comment 'xxxxx' after serverity;
解释:
1、comment 'xxx' 表示对这一列的解释说明;
2、after serverity 表示该列放到serverity列的后面,after后面跟一个列名;当然也可以使用first ,这样可以把该列放到第一列。
三、增加列:
alter table tablename add columns(new_add_cl column_type comment 'xxxx',new_add_cl2 column_type comment 'yyyy' );
这里是增加两列,默认这增加的两列放在末尾,如果想改变位置,那么通过上面的列改变命令change column 来改变列位置。
四、演示:
4.1、创建一个表:
4.2、修改表名:
如上,就成功的将testchange表名修改为了test。
4.2、添加列:
这样就增加了两列:
通过修改列名的命令,移动type列到name列后面:
注意这里是利用修改列名的命令,把type列还是修改为type列,也就是说type名字和类型不变,主要是要利用后面的after来进行移动位置,
查看该表结构,发现type确实移动到了name后面:
当然我们也可以用first放到第一列:
4.3、修改列:
接着上面的操作,我们还可以修改列的名字以及列的类型,当然其实还可以修改列的位置,但上面已经演示了修改列的位置,下面就只演示修改列名和类型:
五、修改表属性:
5.1、如何查看表的属性:
使用该命令来查看表的属性:desc formatted tablename;
5.2、修改表的属性:tblproperties
然后来修改下表的属性:
该命令为:alter table 表名 set tblproperties('属性名'='设置该属性的值');
然后再查看该表的属性,就会多一个comment:
那么如果要把该属性的值修改了,那么可以再执行下该命令,并把属性值重新设置下:
5.3、修改表属性:serdeproperties
serde是序列化和反序列化。也就是说这个表属性serdeproperties是关于序列化和反序列化的属性。
比如,修改表中字段的分割符,字段的分割符会用于序列化和反序列化:
①首先创建一个无分区的表:
注意这里该表中的字段是以'#'分割的。
②针对无分区的表进行修改分割符:
③创建一个分区表:
④针对分区表进行修改分隔符:
如果还用之前那个针对无分区表修改分隔符的语句,那么执行后不会起作用。因此我们需要专门针对有分区的表执行专门的语句:
为什么用之前那个无分区表修改分割符的方式会不起作用呢?
因为第一种方式(之前针对无分区表修改分隔符的方式)对之前加载进表中的数据是没办法修改它们的分割符的,它只对执行该命令之后添加进来的数据(甚至包括新增分区然后添加的数据)生效;
而第二种方式(针对有分区表修改分隔符的方式)还可以对之前加载进来的数据生效,通过指定分区使该分区之前的数据分割符也修改;
无分区和有分区修改分隔符的不同之处:
a>无分区修改的话,用第一种语句方式,对老数据和新数据都生效;
b>有分区修改的话,如果用第一种语句方式,只对之后加载的新数据有效,对之前加载的老数据无效;而如果用第二种方式,指定分区修改,才可以对之前加载的老数据有效。
⑤为什么要修改分割符?
比如我创建表的时候设置的分割符和实际数据里面的分隔符不相同,但这个时候表已经创建了,那么为了不删除后重新创建,我们可以只修改表属性serdeproperties中的分隔符就可以很好的加载数据了。
5.4、修改表属性:location
不管是内部还是外部表都可以指定location位置的。注意:location指定的位置必须是hdfs上的位置。
注意这个语句和前面的语句相比没有用括号来指定值;如果要修改分区表中某个分区的location的话,需要通过partition指定,每一个分区可以有自己单独的location。
另外,我们还可以把内部表转为外部表,以及外部表转为内部表,通过tblproperties这个表属性下的EXTERNAL:
内部表和外部表转化的场景:
比如,有一个内部表,先在我们想增加或者修改一些字段,我们可以先转化它为外部表,然后删除,再重新创建该表。
六、表属性的其他一些操作: