Hive(三)——数据定义

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;
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值