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

简介: Hive教程(03)- Hive数据模型

01 引言

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

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

02 hive数据模型

hive数据模型关系图如下:

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

  • DataBase:数据库
  • Table:表
  • Partition:分区
  • Bucket:桶

2.1 DataBase数据库

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

相关的命令:

  • create database 数据库名
  • use 数据库名
  • 以及drop database数据库名等语句;

2.2 Table表

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

hive表分四种:

  • MANGED_TABLE :内部表
  • EXTERNAL_TABLE:外部表
  • INDEX_TABLE:索引表
  • VIRTUAL_VIEW :视图表

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

  • desc tablename
  • desc formatted tablename

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分区类型

2.3.1.1 静态分区
  • 把输入数据文件单独插入分区表的叫静态分区;
  • 通常在加载文件(大文件)到 Hive 表的时候,首先选择静态分区;
  • 在加载数据时,静态分区比动态分区更节省时间;
  • 你可以通过 alter table add partition 语句在表中添加一个分区,并将文件移动到表的分区中;
  • 我们可以修改静态分区中的分区;
  • 您可以从文件名、日期等获取分区列值,而无需读取整个大文件;
  • 如果要在 Hive 使用静态分区,需要把 hive.mapred.mode 设置为strictset hive.mapred.mode=strict
  • 静态分区是在严格模式进行下;
  • 你可以在 Hive的内部表和外部表使用静态分区。
2.3.1.2 动态分区
  • 对分区表的一次性插入称为动态分区。
  • 通常动态分区表从非分区表加载数据。
  • 在加载数据的时候,动态分区比静态分区会消耗更多时间。
  • 如果需要存储到表的数据量比较大,那么适合用动态分区。
  • 假如你要对多个列做分区,但又不知道有多少个列,那么适合使用动态分区。
  • 动态分区不需要 where子句使用limit
  • 不能对动态分区执行修改。
  • 可以对内部表和外部表使用动态分区。
  • 使用动态分区之前,需要把模式修改为非严格模式。set hive.mapred.mode=nostrict

2.3.2 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 是针对表的某一列进行分桶
  • hive 采用对表的列值进行哈希计算,然后除以桶的个数求余的方式决定该条记录存放在哪个桶中(分桶的好处是可以获得更高的查询处理效率,使取样更高效)。

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

set hive.enforce.bucketing=true;
• 1

分桶表创建命令:

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.4.1 分桶特性

数据分桶原理是基于对分桶列做哈希计算,然后对哈希的结果和分桶数取模。分桶特性如下:

  • 哈希函数取决于分桶列的类型。
  • 具有相同分桶列的记录将始终存储在同一个桶中。
  • 使用 clustered by 将表分成桶。
  • 通常,在表目录中,每个桶只是一个文件,并且桶的编号是从 1 开始的。
  • 可以先分区再分桶,也可以直接分桶。
  • 此外,分桶表创建的数据文件大小几乎是一样的。

2.4.2 分桶好处

  • 与非分桶表相比,分桶表提供了高效采样。通过采样,我们可以尝试对一小部分数据进行查询,以便在原始数据集非常庞大时进行测试和调试;
  • 由于数据文件的大小是几乎一样的,map 端的 join在分桶表上执行的速度会比分区表快很多。在做mapjoin 时,处理左侧表的 map知道要匹配的右表的行在相关的桶中,因此只需要检索该桶即可;
  • 分桶表查询速度快于非分桶表;
  • 分桶的还提供了灵活性,可以使每个桶中的记录按一列或多列进行排序。 这使得 mapjoin 更加高效,因为每个桶之间的 join变为更加高效的合并排序(merge-sort)。

2.5 分区与分桶的区别

分区与分桶的区别:

  • 分区和分桶最大的区别就是分桶随机分割数据库,分区是非随机分割数据库
  • 分区是水平划分,表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫描全表,这对于提高查找效率很有帮助;
  • 分桶是垂直划分,桶是通过对指定列进行哈希计算来实现的,通过哈希值将一个列名下的数据切分为一组桶,并使每个桶对应于该列名下的一个存储文件;
    hive使用对分桶所用的值进行hash,并用hash结果除以桶的个数做取余运算的方式来分桶,保证了每个桶中都有数据,但每个桶中的数据条数不一定相等);
  • 分桶是存储在文件中,分区是存放在文件夹中,分桶要比分区查询效率高。

03 文末

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

目录
相关文章
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
299 4
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
401 3
|
SQL
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
323 2
|
SQL 物联网 数据处理
"颠覆传统,Hive SQL与Flink激情碰撞!解锁流批一体数据处理新纪元,让数据决策力瞬间爆表,你准备好了吗?"
【8月更文挑战第9天】数据时代,实时性和准确性至关重要。传统上,批处理与流处理各司其职,但Apache Flink打破了这一界限,尤其Flink与Hive SQL的结合,开创了流批一体的数据处理新时代。这不仅简化了数据处理流程,还极大提升了效率和灵活性。例如,通过Flink SQL,可以轻松实现流数据与批数据的融合分析,无需在两者间切换。这种融合不仅降低了技术门槛,还为企业提供了更强大的数据支持,无论是在金融、电商还是物联网领域,都将发挥巨大作用。
204 6
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
391 0
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错合集之从mysql读数据写到hive报错,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
SQL 数据采集 存储
Hive实战 —— 电商数据分析(全流程详解 真实数据)
关于基于小型数据的Hive数仓构建实战,目的是通过分析某零售企业的门店数据来进行业务洞察。内容涵盖了数据清洗、数据分析和Hive表的创建。项目需求包括客户画像、消费统计、资源利用率、特征人群定位和数据可视化。数据源包括Customer、Transaction、Store和Review四张表,涉及多个维度的聚合和分析,如按性别、国家统计客户、按时间段计算总收入等。项目执行需先下载数据和配置Zeppelin环境,然后通过Hive进行数据清洗、建表和分析。在建表过程中,涉及ODS、DWD、DWT、DWS和DM五层,每层都有其特定的任务和粒度。最后,通过Hive SQL进行各种业务指标的计算和分析。
3086 1
Hive实战 —— 电商数据分析(全流程详解 真实数据)
|
SQL DataWorks 监控
DataWorks产品使用合集之同步数据到Hive时,如何使用业务字段作为分区键
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
SQL 关系型数据库 HIVE
实时计算 Flink版产品使用问题之如何将PostgreSQL数据实时入库Hive并实现断点续传
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。