testbook

修改表/分区/列:ALTER TABLE/PARTITION/COLUMN

ALTER TABLE可以对表的大多数属性进行修改。大多数时候,ALTER TABLE修改的是表的元数据而不改变表中的数据。

  • 重命名: ALTER TABLE...RENAME TO
    语法
    ALTER TABLE table_name RENAME TO new_table_name;
    
  • 改变表属性:ALTER TABLE...SET TBLPROPERTIES
    我们可以用这个语句给表添加自定义的元数据。
    语法
    ALTER TABLE table_name SET TBLPROPERTIES table_properties;
    table_properties:
      : (property_name = property_value, property_name = property_value, ... )
    
  • 改动表的注解
    语法
    ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);
    
  • 改变SerDe属性
    改变表的SerDe
    语法
    ALTER TABLE table_name SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];
    
    给表的SerDe添加用户自定义的元数据:
    语法
    ALTER TABLE table_name SET SERDEPROPERTIES serde_properties;
    serde_properties:
      : (property_name = property_value, property_name = property_value, ... )
    
  • 改变表的分桶
    语法
    ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name, ...)]
      INTO num_buckets BUCKETS;
    
  • 添加分区
    语法
    ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec
      [LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...;
    partition_spec:
      : (partition_column = partition_col_value, partition_column = partition_col_value, ...)
    
    说明
    该语句给指定的表添加分区。[LOCATION 'location']选项允许我们将已存在的目录添加为表的分区。注意,该目录必须是HDFS目录,不可以是文件。ALATER TABLE ... ADD PARTITION 时,Inceptor会将该目录下所有的文件中的数据都写入表中。
    举例
    下例中,HDFS目录/user/root/test2下有一个放有所有acc_leve = A的文件:
    [$host] transwarp> ALTER TABLE partition_user_info2 ADD PARTITION (acc_level = 'A') LOCATION '/user/root/test2';
    
    [$host] transwarp> SELECT * FROM partition_user_info2;
    马从筠  6513065 115591  140400198711012307      96080357291141  20110101        A
    魏向卉  3912384 841242  522632199301029404      68537153578048  20091202        A
    邱坤    0700735 737297  340811199211252278      14388242322818  20121024        A
    
  • 重命名分区
    语法
    ALTER TABLE table_name PARTITION partition_spec1 RENAME TO PARTITION partition_spec2;
    partition_spec:
      : (partition_column = partition_col_value, partition_column = partition_col_value, ...)
    
  • 交换分区
    语法
    ALTER TABLE table_name_1 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_2;
    partition_spec:
      : (partition_column = partition_col_value, partition_column = partition_col_value, ...)
    
  • 删除分区
    语法
    ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec, PARTITION partition_spec,...;
    partition_spec:
      : (partition_column = partition_col_value, partition_column = partition_col_value, ...)
    
    举例
    将分区的用户信息表中的acc_level = 'A'的分区删除:
    [$host] transwarp> ALTER TABLE partition_user_info DROP PARTITION (acc_level = 'A');
    
    [$host] transwarp> SELECT * FROM partition_user_info;
    华微    5224133 531547  420529198911075631      32638281095907  20080214        B
    祝韩恒  6670192 205239  230801197908126178      73790369990971  20100101        C
    潘营泽  6600641 990590  511521198705077435      48471135593608  20110430        C
    管淑艳  2394923 783438  330683198005210864      99913863445174  20141003        C
    宁新瑶  4580952 986634  420822199001119507      97711008856576  20081031        D
    李韩瑶  2755506 015859  310230197912126559      42412396242237  20110916        D
    李平    8725869 600709  460100198902070313      43081307046984  20130702        E
    
  • 修改表/分区的位置
    语法
    ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location";
    
  • 修改表/分区的保护
    语法
    ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE NO_DROP [CASCADE]
    ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE OFFLINE
    
    用户可以给表和分区加上保护。ENABLE NO_DROP指令可以给表/分区加上保护,阻止表/分区被删除,DISABLE NO_DROP可以将这层保护除去。ENABLE OFFLINE指令可以为表/分区加上保护,阻止对表/分区的查询,但是被阻止查询的表/分区的元数据还是可见的,DISABLE OFFLINE可以将这层保护除去。如果一张表中有分区被加上保护阻止删除,那么这张表便也不能被删除。但是,如果一张表被加上保护阻止删除,表中的分区还是可以被删除的,除非加上 CASCADE关键词,也就是说如果对一张表ENABLE NO_DROPP CASCADE,那么表和表中的分区都不能被删除。
  • 修改列

  • 修改列名、列的数值类型、列在表中的位置和列的注解
    语法
    ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type
      [COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];
    
    上面指令可以对一列的列名、列的数值类型、列在表中的位置、列的注解或者这些的任意组合做出修改。这个指令仅仅修改表的元数据。
    举例
    CREATE TABLE test_change (a INT, b INT, c INT);
    
    //将列a重命名为列a1
    ALTER TABLE test_change CHANGE a a1 INT;
    
    //将列a1重命名为列a2,它的数据类型改为STRING,并将它放在列b之后
    ALTER TABLE test_change CHANGE a1 a2 STRING AFTER b;
    //表test_change的新结构为:(b INT, a2 STRING, c INT)
    
    //将列c重命名为c1, 并将它定位第一列
    ALTER TABLE test_change CHANGE c c1 INT FIRST;
    //表test_change的新结构为:(c1 INT, b INT, a2 STRING)
    
  • 添加/替换列
    语法
    ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) [CASCADE|RESTRICT]
    
    ADD COLUMNS可以将新的列加入表中,位置在所有列之后,分区之前。REPLACE COLUMNS将所有已有的列删除然后加入新指定的列。只能对使用Inceptor自带SerDe (DynamicSerDe, MetadataTypedColumnsetSerDe, LazySimpleSerDe and ColumnarSerDe) 的表使用REPLACE COLUMNS。REPLACE COLUMNS也可以被用于删除列:
    举例
    CREATE TABLE test_change (a INT, b INT, c INT);
    ALTER TABLE test_change REPLACE COLUMNS (a int, b int);
    //将列c删除。