走近大数据之Hive入门(六、Hive的数据模型)

目录

一、Hive的数据存储

二、内部表(Table)

三、分区表(Partition)

四、外部表(External Table)

五、桶表(Bucket Table)

六、视图(View)


一、Hive的数据存储

  • 基于HDFS(Hadoop的数据仓库)

  • 没有专门的数据存储格式(默认的情况下采用'\t'(制表符)作为列与列之间的分隔符)

  • 存储结构主要包括:数据库,文件,表,视图

  • 可以直接加载文本文件(.TXT文件等)

  • 创建表时,指定Hive数据的列分割符与行分隔符

  1. table 内部表

  2. Partiton 分区表

  3. External Table 外部表

  4. 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

 

你可能感兴趣的:(大数据,-,Hive,走近大数据之Hive入门与进阶,hive,大数据,数据类型)