Hive(三)——数据定义
- 每个数据库会创建一个目录,数据库下的表变现为改目录下的子目录(default库无自己的目录)
- 数据库目录默认在hive.metastore.warehouse.dir指定的顶层目录后,例如,常见数据库database,则hive创建一个/user/hive/warehouse/database.db目录。
# 我们可以通过以下命令修改建库默认位置
hive > CREATE DATABASE financials
> LOCATION '/my/preferred/directory';
# 也可以为数据库增加一个描述信息
hive >CREATE DATABASE financials
> COMMENT 'Holds all financial tables';
- 可以为数据库增加一些和其相关的键-值对属性信息,尽管目前仅有的功能就是提供了一种可以通过DESCRIBE DATABASE EXTENDED 语句显示出这些信息的方式:
hive> CREATE DATABASE financials
> WITH DBPROPERTIES ('creator' = 'Mark Moneybags', 'date' = '2012-01-02');
hive> DESCRIBE DATABASE financials;
financials hdfs://master-server/user/hive/warehouse/financials.db
hive> DESCRIBE DATABASE EXTENDED financials;
financials hdfs://master-server/user/hive/warehouse/financials.db
{date=2012-01-02, creator=Mark Moneybags);
- 默认情况下,Hive是不允许用户删除一个包含有表的数据库的。用户要么先删除数据库中的表,然后再删除数据库;要么在删除命令的最后面加上关键字CASCADE,这样可以使Hive自行先删除数据库中的表:
hive> DROP DATABASE IF EXISTS financials CASCADE;
- 可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息
hive> ALTER DATABASE financials SET DBPROPERTIES ('edited-by' = 'Joe Dba');
- Hive会自动增加两个表属性:一个是last_modified_by,另一个是last_modified_time。如果用户未定义任何表属性,那么他们也不会显示在详细信息中。
- 我们可以拷贝一张已经存在的表的表结构(而无需拷贝数据):
CREATE TABLE IF NOT EXISTS employee2 like employee;# 也可指定LOCATION
- 即使我们不在那个数据库下,我们还是可以列举指定数据库下的表的:
hive> SHOW TABLES IN mydb;
# 如果有很多表,可以使用正则表达式
hive>SHOW TABLE 'emplo.*';
# IN database_name语句暂不自持与正则一起使用
- 查看数据库或表的详细信息:
# 查看那数据库信息
hive>DESCRIBE DATABASE EXTENDED data_name;
# 查看表信息
hive>DESCRIBE EXTENDED table_name;
# 使用FORMATTED关键字替代EXTENDED关键字,可以提供更加可读与详细的信息
hive>DESCRIBE FORMATTED table_name; # 常用
# 还能查看表中某字段的信息
hive>DESCRIBE EXTENDED table_name.clo_name;
- 关键字EXTERNAL用于创建hive外部表,好处在于方便和其他工具共享数据。hive对于外部表不具备完全的权限,删除该外部表不会被清除数据,但是元数据会被清除。
- LIKE关键字,复制表结构,且:
1、在无EXTERNAL关键字修饰时新表与模板表同为MANGER_TABLE或者EXTERNAL_TABLE;
2、有EXTERNAL关键字修饰则必为EXTERNAL_TABLE - 将hive设置为“strict”模式,当where字句无分区过滤时,就不会提交这个查询,以防止一个巨大的mapreduce任务。
hive> set hive.mapred.mode=strict;
- 如果我们只想查看某特定分区键的分区:
hive> SHOW PARTITIONS employees PARTITION(country='US');
country=US/state=AL
country=US/state=AK
...
hive> SHOW PARTITIONS employees PARTITION(country='US', state='AK');
country=US/state=AK
- 查看分区数据所在的路径
hive> DESCRIBE EXTENDED log_messages PARTITION (year=2012, month=1, day=2);
- 将配置属性fs.trash.interval的值设置为一个合理的正整数即可(如果设置值为1440,那么就表示是24小时),这个值是“回收站检查点”间的时间间隔,如果不小心删除了一张存储着重要数据的管理表的话,那么可以先重建表,然后重建所需要的分区,再从.Trash目录中将误删的文件移动到正确的文件目录下(使用文件系统命令)来重新存储数据。
- 修改表结构使用ALTER关键字,修改表结构只会修改元数据。
# 重命名
hive> ALTER TABLE log_messages RENAME TO logmsgs;
# 增加、修改和删除表分区
hive> ALTER TABLE log_messages ADD IF NOT EXISTS
PARTITION (year = 2011, month = 1, day = 1) LOCATION '/logs/2011/01/01'
hive> ALTER TABLE log_messages PARTITION(year = 2011, month = 12, day = 2)
SET LOCATION 's3n://ourbucket/logs/2011/01/02';
hive> ALTER TABLE log_messages DROP IF EXISTS PARTITION(year = 2011, month = 12, day = 2);
# 修改列信息(单列)
hive (default)> desc test;
first string
second string
hive (default)> alter table test change (columns) first one int after second; # columns关键字可选
OK # 若使用first,则后面不用跟列名,此操作将目标列提至第一列
hive (default)> desc test;
second string
one int
# 增加列
hive (default)> desc test;
one int
two int
hive (default)> alter table test add columns(three int,forth int);
OK # 此columns不可省略
hive (default)> desc test;
one int
two int
three int
forth int
# 删除或替换列
hive (default)> desc test;
one int
two int
three int
forth int
hive (default)> alter table test replace columns(first string,second string,thrid string);
OK
hive (default)> desc test;
first string
second string
thrid string
# 修改表属性
hive> ALTER TABLE log_messages SET TBLPROPERTIES (
'notes' = 'The process id is no longer captured; this column is always NULL');
- ALTER TABLE … ARCHIVE PARTITION语句会将这个分区内的文件打成一个Hadoop压缩包(HAR)文件。但是这样仅仅可以降低文件系统中的文件数以及减轻NameNode的压力,而不会减少任何的存储空间,使用UNARCHIVE替换ARCHIVE就可以反向操作
hive> ALTER TABLE log_messages ARCHIVE
PARTITION(year = 2012, month = 1, day = 1);
- 下面的语句可以分别防止
分区
被删除和被查询,使用ENABLE替换DISABLE可以达到反向操作的目的。这些操作也都不可用于非分区表
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;