外部分区表
定义外部分区表如下:
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 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即可。