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中建表方式
- 直接建表法
create [EXTERNAL] table 表名(列名 数据类型 comment "列备注") comment "表备注" ;
如:
create table table_name_A(name string , age int); - 查询建表法
create table 表名 AS hive查询SQL
如:
create table table_name_A AS select * from table_name_B - 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个散列桶中。
网友评论