其他分享
首页 > 其他分享> > Hive教程(03)- Hive数据模型

Hive教程(03)- Hive数据模型

作者:互联网

文章目录

01 引言

在前面的教程,已经把Hive环境搭建起来了,有兴趣的同学可以参阅:

既然有了hive的环境,此时大家肯定十分迫切的想把hive用起来,但是用之前,我们是很有必要了解hive的几种数据模型的,也就是需要知道hive把数据最终存在了hdfs的哪里?

02 hive数据模型

hive数据模型关系图如下:
在这里插入图片描述

从上图,可以看到 hive 主要有几种数据模型,分别是:

2.1 DataBase数据库

DataBase数据库:相当于关系型数据库中的命名空间,作用是将数据库应用隔离到不同的数据库模式中 。

相关的命令:

2.2 Table表

Table:表是由存储的数据以及描述表的一些元数据组成。数据存储再分布式文件系统中,元数据存储在关系型数据库中;

hive表分四种:

相关的命令(查看表的具体信息使用):

2.2.1 内部表

hive 会默认把数据存储到 /user/hive/warehouse 目录里面:

CREATE TABLE managed_table (dummy STRING);
LOAD DATA INPATH '/user/tom/data.txt' INTO table managed_table;

描述根据上面的代码,hive 会把文件 data.txt 文件存储在 managed_table 表的 warehouse 目录下,即 hdfs://user/hive/warehouse/managed_table 目录

2.2.2 外部表

外部表与内部表的行为上有些差别。我们能够控制数据的创建和删除。删除外部表的时候,hive只会删除表的元数据,不会删除表数据(数据路径是在创建表的时候指定的):

CREATE EXTERNAL TABLE external_table (dummy STRING)
LOCATION '/user/tom/external_table';
LOAD DATA INPATH '/user/tom/data.txt' INTO TABLE external_table;

描述利用EXTERNAL关键字创建外部表,Hive不会去管理表数据,所以它不会把数据移到/user/hive/warehouse目录下

2.3 Partition分区

Partition分区hive的分区是根据某列的值进行粗略的划分,每个分区对应HDFS上的一个目录。

创建分区表语法:

CREATE TABLE table_name (column1 data_type, column2 data_type)

PARTITIONED BY (partition1 data_type, partition2 data_type,….);

分区表基于分区键把具有相同分区键的数据存储在一个目录下,在查询某一个分区的数据的时候,只需要查询相对应目录下的数据,而不会执行全表扫描,提高查询数据的效率。也就是说,hive 在查询的时候会进行分区剪裁 ,每个表可以有一个或多个分区键。

2.3.1 Partition分区例子

借用大象教程(https://www.hadoopdoc.com/hive/hive-data-model)里的一张图片:
在这里插入图片描述
如上图所示,假如你有一个存储学生信息的表,表名为 student_details,列分别是 student_id,name,department,year 等。现在,如果你想基于 department列对数据进行分区。那么属于同一个 department的学生将会被分在同一个分区里面(在物理上,一个分区其实就是表目录下的一个子目录)。

假如所有 department = EEE 的学生数据被存储在 /user/hive/warehouse/student_details/department=EEE 目录下。那么查询 departmentEEE 的学生信息,只需要查询 EEE 目录下的数据即可,不需要全表扫描,这样查询的效率就比较高。

而在真实生产环境中,你需要处理的数据可能会有几百 TB,如果不分区,在你只需要表的其中一小部分数据的时候,你不得不走全表扫描,这样的查询将会非常慢而且浪费资源,可能95%的数据跟你的查询语句并没有关系。

2.4 Bucket桶

Bucket通描述:

要使用hive的分桶功能,首先需要打开hive对桶的控制:

set hive.enforce.bucketing=true;

分桶表创建命令:

CREATE TABLE table_name

PARTITIONED BY (partition1 data_type, partition2 data_type,….) 

CLUSTERED BY (column_name1, column_name2, …) 

SORTED BY (column_name [ASC|DESC], …)] 

INTO num_buckets BUCKETS;

每个桶只是表目录或者分区目录下的一个文件,如果表不是分区表,那么桶文件会存储在表目录下,如果表是分区表,那么桶文件会存储在分区目录下。所以你可以选择把分区分成 n 个桶,那么每个分区目录下就会有 n 个文件。

举例:从2.3.1 Partition分区例子图可以看到,每个分区有 2 个桶。因此每个分区就会有 2 个文件,每个文件将会存储该分区下的数据。

2.5 分区与分桶的区别

分区与分桶的区别:

03 文末

本文主要讲解了Hive的四种数据模型( DataBase数据库、Table表、Partition分区、Bucket桶),如有疑问的童鞋欢迎评论区留言,谢谢阅读,本文完!

标签:03,分桶,分区,hive,Hive,table,数据,数据库,数据模型
来源: https://blog.csdn.net/qq_20042935/article/details/123049071