目录
一、Hive的数据存储
-
基于HDFS(Hadoop的数据仓库)
-
没有专门的数据存储格式(默认的情况下采用'\t'(制表符)作为列与列之间的分隔符)
-
存储结构主要包括:数据库,文件,表,视图
-
可以直接加载文本文件(.TXT文件等)
-
创建表时,指定Hive数据的列分割符与行分隔符
-
表
-
table 内部表
-
Partiton 分区表
-
External Table 外部表
-
Bucket Table 桶表
-
视图
二、内部表(Table)
与数据库的Table在概念上类似
每一个Table在Hive中都有一个相应的目录(HDFS上的目录)存储数据
所有的Table数据(不包括External Table)都保存在这个目录(HDFS目录)中
表的元数据信息,存储在元数据数据库中(mysql)
删除表后,元数据和数据都会被删除
创建表--案例:
>create table t1 (t1 int, tname string, age int);
在hive中创建一张表,如果不指定表所保存的位置,那么这张表会创建在HDFS文件系统中的/user/hive/warehouse目录下
>create table t2 (tid int, tname string, age int)
location '/mytable/hive/t2';
指定表的位置为HDFS中的/mytable/hive/t2
>create table t3 (tid int, tname string, age int)
row format delimited fields terminated by ',';
表示以csv文件格式存储,因为csv存储的分隔符为逗号,row format 指定表示行的格式
加入数据--案例:
>create table t4 as select * from sample_data;
采用sample_data查询的集合来创建t4表,查看HDFS中的文件发现,t4表中数据与数据之间没有分隔符
这里我们同样可以指定分隔符,采用sample_data查询的集合来创建t5表,并以','为分隔符在一张表上
>create table t5
row format delimited fields terminated by ','
as
select * from sample_data;
加入新的列---案例:
>alter table t1 add columns(english int);
删除一张表--案例:
drop table t1;
当删除一张表时,它会把对应的文件放入HDFS的回收站中,所以删除之后 我们可以利用一定的方式恢复表中的数据
三、分区表(Partition)
Partition对应于数据库Partiton列的密集索引
在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中
创建表--案例
>create table partition_table (sid int, sname string)
partitioned by (gender string)
row format delimited fields terminated by ',';
//创建一张以','分隔,以性别进行分区的分区表partition_table
>insert into table partition_table
partition(gender = 'M')
select sid,sname from sample_data where gender = 'M';
//将sample_data表中,gender为'M'的行数据,插入到paetition_table表中gender为'M'的分区中
>insert into table partition_table
partition(gender = 'F')
select sid,sname from sample_data where gender = 'F';
//将sample_data表中,gender为'F'的行数据,插入到paetition_table表中gender为'F'的分区中
分区的好处是可以提高查询的效率
查看分区与未分区情况下执行计划有何不同: (执行计划读取的顺序是,从下往上,从右往左)
>explain select * from from sample_data where gender = 'M'; //未分区
>explain select * from from partition_table where gender = 'M'; //分区
四、外部表(External Table)
指向已经在HDFS中存在的数据,可以创建Partition
它和内部表在元数据的组织上时相同的,而实际存储则有极大的差异
外部表只有一个过程,加载数据和创建表同时完成,并不会移动到数据仓库目录中,只会与外部数据创建一个链接,当删除该表
时,仅删除该链接而不删除实际的数据
创建外部表
将三个文件放在hdfs中
hdfs dfs -put student01.txt / input
create external table external_student (sid int, sname string, age int)
row format delimited fields terminated by ','
location '/input';--数据源的HDFS文件目录(所谓的外部就是数据源的位置非hive默认存储的位置)
五、桶表(Bucket Table)
桶表是对数据进行哈希取值,然后放到不同文件存储。也就是说,桶表中的数据,是通过哈希运算后,将其打散,再存入文件当
中,这样做会避免造成热块,从而提高查询速度。
桶表创建--案例
>create table bucket_table (sid int, sname string, age int)
clustered by (sname) into 5 buckets;
//创建一个桶表,这个桶表是以sname作为哈希运算,运算后的结果放到5个桶中
六、视图(View)
视图操作和表一样,Hive中的视图不存储数据,只是虚表,是一个逻辑概念;(oracle和mysql中有一种物化视图,是存储有实际
数据的,能提高查询效率)
可以跨越多张表
视图建立在已有基础上,视图赖以建立的这些表称为基表
视图可以简化复杂的查询
案例 (视图能够简化数据)
create view empinfo
as
select e.empno,e.ename,e.sal,e.sal*12 annlsal, d.dname
from emp e, dept d
where e.deptho=d.deptho;
//e.sal*12 annlsal :为e.sal*12起一个别名叫annlsal