zoukankan      html  css  js  c++  java
  • 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:

        

        内部表和外部表转化的场景:

        比如,有一个内部表,先在我们想增加或者修改一些字段,我们可以先转化它为外部表,然后删除,再重新创建该表。

    六、表属性的其他一些操作:

      

  • 相关阅读:
    Gym 100989E
    解决Pycharm无法导入包问题 Unresolved reference
    模块介绍/time/os...
    列表/元组/字符串/字典/集合/文件/字符编码
    迭代器/生成器/装饰器 /Json & pickle 数据序列化
    network / shuangwangka / inner + outer
    performance python httprunner
    performance python locust
    web sec / fastjson safemode
    python 向下取整,向上取整,四舍五入
  • 原文地址:https://www.cnblogs.com/lordcheng/p/7487187.html
Copyright © 2011-2022 走看看