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;