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;