一、概述
Hive是基于Hadoop的分布式数据仓库,相当于在Hadoop框架上架了一层SQL,继承了标准SQL的所有语法操作,最早底层依赖的计算引擎是MapReduce引擎,在最新版本也可以通过修改参数调整计算引擎为Spark。
二、应用场景
1. Hive使用用于海量数据的统计查询分析,除了内置的函数外,也可以自定义函数(UDF)对数据进行离线处理分析
2. Hadoop起初,设计者和许多开发人员将Hadoop用于海量数据的批处理、离线分析,Hive依赖于MR,所以提交的SQL会被转换 为MapReduce Job在MR上执行,执行少量数据,hive也要经历编译器、解释器、优化器,任务提交这些流程,所以相比与传统 的Mysql、Oracle,Hive无法体现出它的优势,但是当处理海量数据时,Hive的批处理优势体现的会比较明显。
三、Hive框架
有上图可以看出,HDFS和MR是Hive框架的根基,Hive的数据会存在HDFS上,HQL会编译转换MR Job运行在MarpReduce上。
四、数据单元
1. Database(数据库)
大部分的数据库都有表空间、视图、数据库等逻辑上的概念,主要用于划分不同的逻辑空间,方便在实际应用中对不同业务系统或者模块产生的数据进行管理查询分析,Hive也有数据库的概念,postgres数据库有namespace,mysql有database等。
2.Table(数据表)
等同于关系型数据库的表,Hive的表形式分为内表和外表。
内部表:默认情况下创建表时,不指定EXTERNAL关键字和/user/hive/warehouse以外的路径都是内部表,内部表的数据都默认存储在HDFS的/user/hive/warehouse目录下。
外部表:在创建表是指定EXTERNAL关键字,并且指定/user/hive/warehouse以外的路径为外部表,外部表的数据存储在指定的HDFS路径下。
两者的区别:当drop内部表的时候,其表数据和元数据会都被删除,不在存在;当drop外部表的时候,只会删除掉元数据,存储在HDFS路径下的数据是不会被删除的,所以在更多的生产业务场景中,会更多的采用外部表。
3.Partations(分区)
分区的概念在很多关系型数据库中都有,Hive分区类似于关系型数据库的表分区,将同类型的数据划分到一个分区里面,会大大提升查询性能。
4.Buckets(分桶)
Hive还有一个分桶的概念,当我们划分了分区之后,还想在分区里面在继续进行划分,这时候就可以利用分桶的概念进行划分,相当于子分区,把Key相同的数据放在同一个Bucket中,方便抽样和查询。多用于数据抽样和查询分析。