一、Hive 是什么
Hive 是构建在 Hadoop 之上的数据仓库平台;它通过 SQL 解析引擎把 SQL 语句转译成 MapReduce 作业,并在 Hadoop 上运行;Hive 表是 HDFS 的文件目录,一个表对应一个目录名,如果有分区,则分区值对应子目录。
二、Hive 架构
解释图中元素:
1、解析器
1)译器:完成 HQL 语句从词法分析、语法分析、编译、优化以及执行计划的生成。
2)优化器:是一个演化组件
3)执行器:舒徐执行所有的 job,如果 task 链不存在依赖关系,可以采用并发执行的方式执行 job。
2、元数据库
元数据用于存放 Hive 库的基础信息,它存在关系数据库中,如 mysql。元素据包括:数据库信息、表名、列表和列的分区及其属性,表的属性,表的数据所在的目录。
三、托管表与外部表
Hive 表分为两类,一个是托管表(内部表),一个是外部表。
托管表是只在 hive 中使用,外部表示 hive 之外也使用,它们下面两个方面有区别:
3.1 数据存储
托管表:数据存储在 hive 仓库目录下,是指定的。我指定为:/apps/hive/warehouse
外部表:外部表可存在 hdfs 的任意目录下。
3.2 数据删除
托管表:删除元数据和数据。
外部表:只删除元数据。
四、分区和桶
4.1 分区
分区其实就是在一个 hdfs 大的文件夹下面的子文件夹,它不是表的上面的结构,分区可以帮助我们来缩小查询的范围从而提高效率。在导入数据的时候,可以根据数据中的特定列把数据放到指定分区中,即指定文件夹中。
4.2 桶
桶是表上面的附加结构,可以提高查效率。桶对应于 MapReduce 的输出文件分区,一个作业产生的桶和 reduce 任务个数相等。
MapReduce 的输出文件分区,一个作业产生的桶和 reduce 任务个数相等。
我个人理解是表对应的是文件夹,分区是文件夹下的子文件夹,而桶就是对应于子文件夹里的文件了,我们把具有相同特征的内容放到一个文件里,即一个桶中。