humidy
作者humidy·2015-03-02 09:07
信息分析/架构师·某公司

Hive中修改表操作

字数 3664阅读 4051评论 0赞 1

编写人:胡旻   版本:V_0.5   修改时间:20150301

大多数Hive表属性可以通过ALTER TABLE 语句来进行修改。这种修改会修改元数据,但不会修改数据本身。这些语句可用于修改表模式中出现的错误、改变分区路径,以及一些操作。

 

表重命名

使用以下这个语句可以将表log_messages重命名logmsgs:

ALTER TABLE log_messages RENAME TO logmsgs;

 

添加、修改和删除表分区

正如我们前面所见到的,ALTER TABLE table ADD PARTITION …语句用于为表(通常是外部表) 添加一个新的分区。这里我们增加可提供的可选项,然后多次重复前面的分区路径语句。

ALTER TABLE log_messages ADD IF NOT EXISTS

PARTITION (year = 2011,month = 1,day = 1) LOCTION ‘/logs/2011/01/01

PARTITION (yaer = 2011,month = 1,day = 2) LOCATION ‘/logs/2011/01/02

PARTITION (yaer = 2011,month = 1,day = 3) LOCATION ‘/logs/2011/01/03

…;

 

注:当使用hive v0.8或其后的版本时,在同一个查询中可以同时增加多个分区。IF NOT EXISTS也是可选的,且含义不变。

 

同时,用户还可以通过高效地移动位置来修改某个分区的路径:

ALTER TABLE log_messages PARTITION(year= 2011, month = 12,day = 2)

SET LOCATION ‘s3n://ourbucket/logs/2011/01/02’;

这个命令不会将数据从旧的路径转移走,也不会删除旧的数据。

最后,用户可以通过如下语句删除某个分区:

ALTER TABLE log_messages DROP IF EXISTS PARTITION(year = 2011,month = 12,day = 2);

对于管理表,即使是使用ALTER TABLE…ADDPARTITION 语句增加分区,分区内的数据也是会同时和元数据信息一起被删除的。对于外部表,分区内数据不会被删除。

 

修改列信息

用户可以对某个字段进行重命名,并修改其位置、类型或者注释:

ALTER TABLE log_messages CHANGE COLUMN hms hours_minutes_seconds INT AFTER severity;

 

即使字段名或者字段类型没有变,用户也需要完全指定旧的字段名,并给出新的字段名及新的字段类型。关键字COLUMN和COMMENT子句都是可选的。前面所演示的例子中,我们将字段转移到severity字段之后。如果用户想将这个字段移动到第一个位置,那么只需要使用FIRST关键字代替AFTER other_column子句即可。

 

和通常一样。这个命令只会修改元数据信息,如果用户移动的是字段,那么数据也应当和新的模式匹配或者通过其他某些方法修改数据以使其能够和模式匹配。

 

增加列

用户可以在分区字段之前添加新的字段到已有的字段之后

ALTER TABLE log_messages ADD COLUMNS(

App_name STRING COMMENT ‘Application name’,

Session_id LONG COMMENT ‘The current session id’);

 

如果新增的字段中有某个或多个字段位置是错误的,那么需要使用ALTER TABLE 表明 CHANGE COLUMN语句逐一将字段调整到正确的位置。

 

删除或替换列

在下面这个例子中移除了之前所有字段并重新指定了新字段:

ALTER TABLE log_messages REPLACE COLUMNS(

Hours_mins_secs INT COMMENT ‘hour, minute, seconds from timestamp’,

Severity STRING COMMENT ‘The message severity’

Message STRING COMMENT ‘The rest of the message’);

 

注意:分区之前的字段可以重新指定。

REPLACE语句只能用于SerDe模块的表:DynamicSerDe或者MetadataTypedColumnsetSerDe。

 

修改表属性

用户可以增加附加的表属性或者修改已存在的属性,但是无法删除属性:

ALTER TABLE log_messages SET TBLPROPERTIES(

‘notes’=’The process id is no longer captured; this column is always NULL’);

 

修改存储属性

有几个ALTER TABLE语句用于修改存储格式和SerDe属性,或者修改成了SEQUENCE FILE

ALTER TABLE log_messages

PARTITION (year=2012, month =1, day=1 )

SET FILEFORMAT SEQUENCEFILE;

如果是分区表,那么需要使用PARTITION子句。

用户可以指定一个新的SerDe,并为其指定SerDe,或者修改已存在的SerDe的属性。如下演示com,example.JSONSerDe的Java类来处理记录使用JSON编码的文件:

ALTER TABLE table_using_JSON_storage

SET SERDE ‘com.example

WITH SERDEPROPERTIES(

‘prop1’ = ‘value1’,

‘prop2’ = ‘value2’);

SERDEPROPERTIES中的属性会被传递给SerDe模块。需要注意的是,属性名(例如prop1)和属性值(例如value1)都应当是带引号的字符串。

 

SERDEPROPERTIES这个功能是一种方便机制,它使得SerDe的各种实现都允许用户进行自定义。

 

下面演示了如何向一个已存在着的SerDe增加新的SERDEPROPERTIES属性:

ALTER TABLE table_using_JSON_storage

SET SERDEPROPERTIES(

‘prop3’ = ‘value3’,

‘prop4’ = ‘value4’);

 

众多的修改表语句

我们将讨论一种为各种操作增加执行“钩子”的技巧。AFTER TABLE … TOUCH语句用于触发这些钩子:

ALTER TABLE log_messages TOUCH PARTITION(year = 2012,day = 1);

PARTITION子句用于分区表。这种应用场景是,当表中存储的文件在Hive之外被修改了,就会触发钩子的执行

 

ALTER TABLE … ARCHIVE PARTITION语句会将这个分区内的文件打成一个Hadoop压缩包(HAR)文件。但是这样仅仅可以降低文件系统中的文件数以及减轻NAMENODE的压力,而不会减少任何的存储空间。

ALTER TABLE log_messages ARCHIVE

PARTITION(year = 2012, month =1, day =1);

使用UNARCHIVE替换ARCHIVE就可以反向操作。这个功能只能用于分区表中独立的分区。

 

最后一个是,Hive提供了各种保护,下面语句可以分别防止分区被删除和被查询:

ALTER TABLE log_message

PARTITION(year = 2010, month = 1,day = 1) ENABLE NP_DROP;

 

ALTER TABLE log_message

PARTITION(year = 2010, month = 1,day = 1) ENABLE NP_OFFLINE;

使用ENABLE替换DISABLE可以达到反向操作的目的。这些操作都不可以用于非分区表

 

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广