Hive Drop,Truncate&Alter

Hive Drop,Truncate&Alter

这里主要介绍除create语句外两种常用的语句, Drop,Truncate和Alter。

Drop,Truncate

DROP TABLE [IF EXISTS] table_name [PURGE];

DROP TABLE命令将会删除这个表的元数据和数据,如果是内部表且配置了Trash并且PURGE没有指定数据将会被移动到当前目录的.Trash下,元数据会直接被删除,若是外部表,数据依然在文件系统中,只是删除元数据。若是使用DROP TABLE table_name PURGE,表数据将会被直接删除而不是移动到.Trash,因此在使用时需要小心,前边介绍过可以再创建表时定义 TBLPROPERTIES中auto.purge的值也会有此功能。在hive中drop表不存在将会报错,除非你使用IF EXISTS或者配置 hive.exec.drop.ignorenonexistent为true。

TRUNCATE TABLE table_name [PARTITION partition_spec];

partition_spec:
  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

要主要使用TRUNCATE命名的表不能是外部表或者非本地表,使用这个命令将会移除表或者分区下的所有数据,若果Trash可用,数据将会被删除到Trash中,否则将会被直接删除。删除分区下数据时用户可以指定多个分区。从hive2.3起,TRUNCATE命令也与TBLPROPERTIES中auto.purge有关系。

Alter

alter命令跟传统数据库的alter命令类似,主要对表进行修改。主要由表,分区,行三个级别组成

Alter Table

ALTER TABLE table_name RENAME TO new_table_name;

重命名表的名称,从hive0.6版本开始,重命名内部表( managed table)将会移动它的hdfs位置,在hive2.2以后,一个内部表( managed table)若是创建时没有指定LOCATION才会改变hdfs位置,在0.6版本以前仅仅在元数据中修改名称。

ALTER TABLE table_name SET TBLPROPERTIES table_properties;

table_properties:
  : (property_name = property_value, property_name = property_value, ... )

你可以使用这个命令来添加自己的元数据到表中,目前last_modified_user, last_modified_time属性由hive自动的添加和管理。可以使用DESCRIBE EXTENDED table_name来获取这些信息,用户也可以只用这个命令来修改表的属性,比如修改auto.purge,external等信息。

ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);

表的comment信息也是TBLPROPERTIES 的一部分。

ALTER TABLE table_name [PARTITION partition_spec] SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];

ALTER TABLE table_name [PARTITION partition_spec] SET SERDEPROPERTIES serde_properties;

serde_properties:
  : (property_name = property_value, property_name = property_value, ... )

这个语句使用户可以改变表的Serde或者想Serde中添加或修改serDe属性(SerDe properties),实际上就是向SerDe类传入一些参数,Serde根据传入的属性进行序列化或者反序列化。注意以上property_name 和 property_value都必须用引号包含。

ALTER TABLE table_name SET SERDEPROPERTIES ('field.delim' = ',');

设置字段分隔符。

ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name, ...)]
  INTO num_buckets BUCKETS;

设置表为分桶表。改变了表的屋里存储属性,这个命令只会修改表的元数据,并不会重新组织已存在的数据,用户要已存在的数据布局符合元数据的定义,否则无法查询。

使用alter语法改变倾斜表参考以往介绍倾斜表(Skewed)。

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (column, ...) DISABLE NOVALIDATE;
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column, ...) REFERENCES table_name(column, ...) DISABLE NOVALIDATE RELY;
ALTER TABLE table_name DROP CONSTRAINT constraint_name;

也可以使用以上描述来添加或者删除表约束。

Alter Either Table or Partition

一下语句不仅支持table级别也支持分区级别。

ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format;

改变表或者分区的文件格式,这个操作仅仅改变表的元数据。

ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location";

修改表或者分区的location。

ALTER TABLE table_name TOUCH [PARTITION partition_spec];

TOUCH会读取元数据,并进行回写,一个使用示例就是如果你需要记录所有被修改该的表或者分区,包括使用外部脚本修改的表或者分区。因为脚本修改文件时在hive之外,所以这个修改该不会被记录,但是外部脚本可以通过调用TOUCH将修改的表或者分区进行记录。若是我们需要可靠的最后修改时间,这是很有用的。(按照自己的理解介绍的)

ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])]
  COMPACT 'compaction_type'[AND WAIT]
  [WITH OVERWRITE TBLPROPERTIES ("property"="value" [, ...])];

与hive的事务功能相关,暂不了解,以后了解下hive的事务。

ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] CONCATENATE;

如果表或者分区中包含许多小RCfile或者ORCfile,使用以上命令将会把它们合并为一个大的文件,在RCFile的情况下,合并发生在块(block)级别,而ORC文件合并发生在条带(stripe)级别,从而避免了解压缩和解码数据的开销。

Alter Partition

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];

partition_spec:
  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

用户可以使用 ALTER TABLE ADD PARTITION命令来为表添加分区,分区的值仅仅是字符串的时候需要用引号,这个location必须是数据文件所在的目录,这个命令仅仅改变表的元数据,并不载入数据,如果location下的数据不存在,查询将不会返回结果。若是添加到的指定分区已存在或抛出错误,你可以使用IF NOT EXISTS来跳过错误。

ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;

可以使用以上语句来改变分区列的值。

-- Move partition from table_name_1 to table_name_2
ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_1;
-- multiple partitions
ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec, partition_spec2, ...) WITH TABLE table_name_1;

以上语句能够移动分区的数据从一个表到另一个有相同结构的表,并且目标表没有这个分区。

MSCK REPAIR TABLE table_name;

hive存储分区的列表到元数据库中,但是,若是新的分区采用操作文件的方式添加,元数据库将不会知道这个分区,除非用户使用ALTER TABLE table_name ADD PARTITION来添加每一个新加的分区。用户也可以直接通过以上命令来修复分区,它将添加存在于HDFS但不在Metastore中的任何分区,但是若是存在大量需要修复的分区时,可以批量运行MSCK REPAIR TABLE在避免内存溢出,通过配置hive.msck.repair.batch.size提供批处理的大小,然后hive自动的进行内部批处理,默认值是0,也就是一次执行所有分区。在hive1.3后msck命令使用若是目录中含有分区值不允许使用的字符将会抛出异常,可以配置hive.msck.path.validation来设置处理策略,‘skip’将会跳过这个目录,‘ignore’将尝试创建分区,但是可能不会起作用。

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...]
   [PURGE];            -- (Note: PURGE available in Hive 1.2.0 and later, IGNORE PROTECTION not available 2.0.0 and later)

删除分区的drop与table类似。

ALTER TABLE table_name ARCHIVE PARTITION partition_spec;
ALTER TABLE table_name UNARCHIVE PARTITION partition_spec;

归档就是把分区文件移动到 Hadoop Archive (HAR),下篇介绍下归档。

Alter Column

ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type
  [COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];

这个命令允许用户来改变列名称,数据类型,描述,或者它们的任意组合,同样这个命令将会仅仅修改hive的元数据,而不会去修改该数据,用户要保证实际的数据符合元数据的定义。有如下使用方法:

CREATE TABLE test_change (a int, b int, c int);

// First change column a's name to a1.
ALTER TABLE test_change CHANGE a a1 INT;

// Next change column a1's name to a2, its data type to string, and put it after column b.
ALTER TABLE test_change CHANGE a1 a2 STRING AFTER b;
// The new table's structure is:  b int, a2 string, c int.

// Then change column c's name to c1, and put it as the first column.
ALTER TABLE test_change CHANGE c c1 INT FIRST;
// The new table's structure is:  c1 int, b int, a2 string.

// Add a comment to column a1
ALTER TABLE test_change CHANGE a1 a1 INT COMMENT 'this is column a1';

hive也支持添加和替代列。

ALTER TABLE table_name 
  [PARTITION partition_spec]                 -- (Note: Hive 0.14.0 and later)
  ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
  [CASCADE|RESTRICT]                         -- (Note: Hive 1.1.0 and later)

ADD COLUMNS将会在所有字段最后,分区之前添加一个新列,这个也支持AVRO类型的表。REPLACE COLUMNS将会移除所有已存在的列并且添加新的列到表中,这只能用于具有本地SerDe(DynamicSerDe,MetadataTypedColumnsetSerDe,LazySimpleSerDe和ColumnarSerDe)的表,这个语句也可以用来删除列,如ALTER TABLE test_change REPLACE COLUMNS (a int, b int);若是test_change有a,b,c三个字段,则使用上面命令后删除了c字段。

注意到,hive中不支持alter table table_name drop column。

参考文献

1.HIVE LanguageManualDDL

你可能感兴趣的:(hive)