Hive

Hive的本质是一个翻译器。它的任务就是将一种类SQL(HQL)的语句翻译成Mapreduce任务,通过执行Mapreduce任务来对海量数据仓库进行处理。从表面上来看它就是一个数据仓库能够查询与分析数据。它与Hadoop的关系如下图所示:
在这里插入图片描述

与传统数据库相比Hive的主要特点为:

①分析离线存储数据,不具有实时性

②不支持事务,由于是历史数据所以没有必要去增删改。

③不支持修改,由于是历史数据所以没有必要去增删改。

④有很多的数据冗余保障了系统的健壮性。

关于Hive的5条重要的结论

默认环境是Linux+Hadoop

Hive中的数据库实际上是HDFS文件系统中的一个[库名].db的文件夹。
Hive中数据库下的表,是库文件夹下的一个子文件夹。
Hive中一个表中的数据就是+在对应表文件夹下的一个或者是一些子文件。
Hive的HQL会转化成Mapreduce任务来执行。
Hive中维护着一个默认的文件库就是HDFS中的/user/hive/warehouse目录。
Hive转化成Mapreduce的流程
在这里插入图片描述
根据SQL语法规则完成SQL语法与词法解析,将SQL转换为SQL语法树。
遍历语法树找出基本的查询单元QueryBlock。
遍历QueryBlock翻译为执行操作树。
逻辑层优化器进行执行树变换减少Shuffle数据量进而达到优化。
遍历执行树翻译为MR任务。
物理优化器进行MR任务变换生成最终的执行计划。

Hive的元数据库

前面我们知道Hive的本质是一个翻译器,它的真实数据都存放在HDFS上,与此同时我们知道Hive并不是文件的胡乱堆放而是一个有逻辑结构的整体,那么这个逻辑结构是如何呈现出来的呢?这里就引出了元数据库。Hive的元数据库(本质上是一个关系型数据库)存储着Hive的元数据信息具体就是指库、表、列等数据之间关系的描述。默认情况下Hive的元数据存放在derby数据库当中。这个数据库有以下信息:

1.它是一个单用户的数据库。
2.每当在一个新的文件夹下启动Hive的时候就会新建一个存储元数据的文件夹出来。这就造成了很大的不便。

所以在实务上我们一般使用MySQL来存储Hive的元数据信息。下面简要介绍元数据库中一些重要的表:

①DBS:存储了Hive库相关的信息,包括库编号、库名称、以及库所对应的HDFS文件的存储位置。

②TBLS,存储了Hive表中相关的信息,表编号、所属库的编号、表名称、表所有者、表类型。

COLUMNS_V2:这里面存储着列相关的信息:所属表的编号,列名称,列的位置。
SDS:Hive表对应着表的编号,HDFS中文件的位置。
总结:通过这些信息我们就可以把这些文件从逻辑上组织在一起这也就是我们最后看到的Hive。

Hive中的内部表与外部表

前面我们知道一个表就会对应一个文件。我们可以通过Hive直接创建一个表这时HDFS中也就相应的会创建一个文件。同时我们还可以预先创建一个文件然后再Hive建表的时候将一个表与当前已经建立好的文件相互关联。通过前一种方式建立的Hive表就是Hive内部表,内部表的特点就是在使用Hive命令删除表相关的操作时HDFS上对应的文件就会被删掉。通过第二种方式建立的表就是外部表,通过外部表的特征就是Hive的一切命令都不能够对外部文件造成影响。是生产环境中两种建表的方式都有用到。

内部表
先有表 后有数据,数据被存储到hdfs目录下表对应的文件夹进行管理。
外部表
先有数据后有表,hive表关联到该位置管理其中的数据。

Hive中的分区表

Hive分区表的出现时为了提高查询效率。它的思想与Mysql中的BTree索引很像,如果我们要查询一个分区内的数据我们就可以提前过滤掉很大一批的数据进而将我们的查询由全表遍历变成选择性的遍历。分区表的具体实现就是在一个表对应的文件夹下面再建立对应的子文件夹,最后在子文件夹下再存放真实的数据。这就让我们想到子文件夹事实上就是一种树的结构。这也就是Hive分区为这么快的原因。比如说在书籍下面有小说、杂志、名著等分区,那么Hive的做法就是在书籍对应的子文件夹下再建立小说、杂志、名著等子文件夹。然后再在小说下面的文件夹中存放小说对应的子文件,以此类推。现在如果我们要查找一个数据下面的一个对应的子类时我们会直接遍历某个子文件夹下面的数据(提前过滤掉了大部分的数据,而不是以前的全表遍历)。

Hive中的分桶

在解释分桶之前先让我们回想一下统计学中的抽样,抽样的目的就是得到样本然后通过研究样本的规律然后对整体做出估计的一种方法。什么是好的样本——独立同分布的。Hive中的分桶是为了采样而做准备的,所以与Hive分区相比,Hive中的分桶是一种更加细粒度的划分。比如说我们现在要在上述的小说、杂志、名著中取样然后我们就会在小说的分区中抽取一点,杂志的分区中抽取一点、名著的分区中抽取一点。这样的话就能够得到一个样本。而Hive中把这抽取的一点打包在一个桶中,现在的场景就是在小说的分区中抽取一桶,杂志的分区中抽取一桶、名著的分区中抽取一桶。这样就会得到样本。又,我们需要的是独立同分布的样本所以我们使用Hash算法来讲分区中的数据随机分桶。这就是Hive中的分桶。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值