Hive的数据存储
代码语言:javascript复制基于HDFS
没有专门的数据存储格式
存储结构主要包括:数据库、文件、表、视图
可以直接加载文本文件(.txt文件)
创建表时,指定Hive数据的列分隔符与行分隔符
表
Inner Table(内部表)
代码语言:javascript复制与数据库中的 Table 在概念上是类似
每一个 Table 在 Hive 中都有一个相应的目录存储数据
所有的 Table 数据(不包括 External Table)都保存在这个目录中
删除表时,元数据与数据都会被删除
// 创建一张内部表 每行字段以什么分割
create table tt (id int,name string,age int) row format delimited fields terminated by ',';
Partition Table (分区表)
代码语言:javascript复制Partition 对应于数据库的 Partition 列的密集索引
在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中
// 创建一张分区表,以部门编号为分区,每行字段逗号分割
create table tt (id int,name string,age int) partitioned by (pno int) row format delimited fields terminated by ',';
往分区表中插入数据:
代码语言:javascript复制// 从已知表里导入数据
insert into table tt partition(pno=10) select id, name, age from emp where dpno=10;
// 从本地文件中导入数据
load data local inpath '/opt/data/order_created.txt' (overwrite) into table tt partition(pno=10);
// 从HDFS文件中导入数据
load data inpath '/opt/data/order_created.txt' (overwrite) into table tt partition(pno=10);
在Hive中,通过SQL的执行计划获知分区表提高的效率
External Table(外部表)
代码语言:javascript复制指向已经在 HDFS 中存在的数据,可以创建 Partition
它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异
外部表 只有一个过程,加载数据和创建表同时完成,并不会移动到数据仓库目录中,只是与外部数据建立一个链接。当删除一个外部表时,仅删除该链接
// 创建外部表
create external table ex_tt (id int, name string, age int) row format delimited fields terminated by ',' location '/students'
Bucket Table (桶表)
代码语言:javascript复制桶表是对数据进行哈希取值,然后放到不同文件中存储。
需要设置环境变量:set hive.enforce.bucketing = true;
// 创建桶表
create table tt_bucket (id int, name string, age int) clustered by (age) into 4 buckets row format delimited fields terminated by ',';
视图(View)
代码语言:javascript复制视图是一种虚表,是一个逻辑概念;可以跨越多张表
视图建立在已有表的基础上, 视图赖以建立的这些表称为基表
视图可以简化复杂的查询
// 创建视图
create view myview as select sname from student;