修改表/分区/列: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删除。