hive 建表方式及参数详解

Hive 表简单介绍

   hive中有两种表:外部表和内部表(managed and external)。可以通过desc formatted table_name 命令来查看表的信息,来辨别表是外部表还是内部表。 在hive默认创建到表是内部表,外部表创建需要加EXTERNAL 命令,如:CREATE EXTERNAL table_name
   内部表的文件,元数据和统计信息等由hive进行管理,一般被存储在hive.metastore.warehouse.dir 目录下,当表被删除或者分区被删除,相对应的数据和元数据就会被删除。一般用来当做临时表。
外部表与内部表相反,可以指定location,可以不基于hive来操作外部表文件。当表被删除或者分区被删除时对应的数据还会存在。只是hive删除了其元信息,表的数据文件依然存在于文件系统中。若是表被删除,可以重新建这个表,指定location到数据文件处,然后通过msck repair table table_name命令刷新数据的元信息到hive中,也就是恢复了数据。
   msck repair table 的详细用法就不讲了,可以参考HIVE常用命令之MSCK REPAIR TABLE命令简述

Hive 常用建表

先说下Hive官网介绍的3中建表方式
  1. 直接建表法
    create [EXTERNAL] table 表名(列名 数据类型 comment "列备注") comment "表备注" ;
    如:
    create table table_name_A(name string , age int);
  2. 查询建表法
    create table 表名 AS hive查询SQL
    如:
    create table table_name_A AS select * from table_name_B
  3. like建表法
    create table 需要创建的表 like 需要复制结构的表;
    like 方法会创建一个和原有表结构完全一样的一张新表,不会执行MapReduce,并且没有数据。
    如:
    create table table_name_A like table_name_B;

Hive 常用建表参数详解(主要说直接建表时的参数)

  • 分区
    create table test_table (...) partitioned by(ds string comment '时间分区字段')
    这里partitioned by 表示按什么字段进行分割,通常来说是按时间
  • 修改分隔符
    create table test_table (...) fields terminated by ','
    默认是\001或者^A,这里指定的是逗号分隔符,还可以指定其他列的分隔符,看实际需求
  • 指定HDFS文件位置
    create table test_table (...) location '/tmp/test_location';
    其中/tmp/test_location可不必先创建
  • 修改文件存储格式
    create table test_table (...) stored as rcfile
    hive目前支持三种方式(stored as 为指定格式的关键字):
      1:就是最普通的textfile,数据不做压缩,磁盘开销大,解析开销也大
     2:SquenceFIle,hadoop api提供的一种二进制API方式,其具有使用方便、可分割、可压缩等特点。
     3:rcfile行列存储结合的方式,它会首先将数据进行分块,保证同一个record在一个分块上,避免读一次记录需要读多个块。其次块数据列式存储,便于数据存储和快速的列存取。
     RCFILE由于采用是的列式存储,所以加载时候开销较大,但具有很好的查询响应、较好的压缩比。
  • 聚类存储
    create table test_table (...) clustered by(id) sorted by(name) into 32 buckets
    这里表示将id按照name进行排序,聚类汇总,然后分区划分到32个散列桶中。

你可能感兴趣的:(hive 建表方式及参数详解)