Hive 读书笔记4:HiveQL Data Definition(下)

外部分区表

定义外部分区表如下:

CREATE EXTERNAL TABLE IF NOT EXISTS log_messages (
hms INT,
severity STRING,
server STRING,
process_id INT,
message STRING)
PARTITIONED BY (year INT, month INT, day INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

定义一般的外部表,需要指定LOCATION,但是这一规定对外部分区表不在适用。相反,外部分区表需要用“Alter table”指令来挂载每个分区。 需要为每一个分区键指定值,例如:

ALTER TABLE log_messages ADD PARTITION(year = 2012, month = 1, day = 2)
LOCATION 'hdfs://master_server/data/log_messages/2012/01/02';--添加分区

ALTER TABLE log_messages PARTITION(year = 2011, month = 12, day = 2)
SET LOCATION 's3n://ourbucket/logs/2011/01/02'; --修改分区

这种目录结构不是强制要求的,仅仅是因为这样比较方便从逻辑上管理数据。与非分区的外部表一样,Hive并不拥有这些数据,在删除表的时候,仅仅删除表定义;同样的,也可以用show partitions指令查看分区:

SHOW PARTITIONS log_messages;


DESCRIBE EXTENDED指令能够将分区键显示出来,与表的其它字段一起:

DESCRIBE EXTENDED log_messages;


但是它却不包含一个关键的信息:分区文件的位置。可以用以下办法得到:

DESCRIBE EXTENDED log_messages PARTITION (year=2012, month=1, day=2);

Hive使用serializer/derserializer来进行记录的解析,对于TextFile的格式,Hive默认使用org.apache.hadoop.hive.serde2.lazy.
LazySimpleSerDe。而将查询写入文件或者控制台,对于TextFile的格式,Hive默认使用org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat。同样可以指定第三方的SerDe。


删除表

删除表可以用语句:

DROP TABLE IF EXISTS employees;

对于托管表,删除表定义的同时也将数据删除了,如果不小心删除了重要数据,可以到/user/$USER/.Trash目录下去找回,前提是启用过了Hadoop回收站这一功能(默认不启用,例如可以手动设置fs.trash.interval为1,440,即24小时),具体方法是,重建表,重建分区,然后将.Trash目录下的文件移动到正确的目录下并存储数据。

对于外部表,删除表仅仅删除了元数据,并不删除数据。


修改表

修改表仅仅修改的是元数据,不会修改数据,这种一致性需要用户自己来保证。


重命名表
重命名表可以用:

ALTER TABLE log_messages RENAME TO logmsgs;


分区维护
添加分区:
ALTER TABLE log_messages ADD IF NOT EXISTS
PARTITION (year = 2011, month = 1, day = 1) LOCATION '/logs/2011/01/01'
PARTITION (year = 2011, month = 1, day = 2) LOCATION '/logs/2011/01/02'
PARTITION (year = 2011, month = 1, day = 3) LOCATION '/logs/2011/01/03'
对于外部表,分区修改和删除并不删除数据,变化的仅仅是元数据。

修改字段

修改字段:

ALTER TABLE log_messages
CHANGE COLUMN hms hours_minutes_seconds INT
COMMENT 'The hours, minutes, and seconds part of the timestamp'
AFTER severity;
需要分别指定字段的旧名、新名及其类型,哪怕你不修改这个类型。如果不移动字段的位置,“After”语句也是不需要的,本例中将其移动到了“severity”字段之后。同样,修改的仅仅是元数据,需要用户自己保证其与数据的一致性。

添加字段

在已有字段后面添加字段:

ALTER TABLE log_messages ADD COLUMNS (
app_name STRING COMMENT 'Application name',
session_id LONG COMMENT 'The current session id');
如果字段的位置不对,可以用前面的ALTER COLUMN 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');


其它

禁止一个分区被删除或者查询

ALTER TABLE log_messages
PARTITION(year = 2012, month = 1, day = 1) ENABLE NO_DROP;
ALTER TABLE log_messages
PARTITION(year = 2012, month = 1, day = 1) ENABLE OFFLINE;
要做相反的操作,只需要将enable改为disable即可。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值