Hive是一个构建在Hadoop之上的数据仓库软件,它可以使已经存储的数据结构化,它提供类似sql的查询语句HiveQL对数据进行分析处理。
Hive将HQL转换为MapReduce的流程
了解了MapReduce实现SQL基本操作之后,我们来看看Hive是如何将SQL转化为MapReduce任务的,整个编译过程分为六个阶段:
Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
遍历AST Tree,抽象出查询的基本组成单元QueryBlock
遍历QueryBlock,翻译为执行操作树OperatorTree
逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
遍历OperatorTree,翻译为MapReduce任务
物理层优化器进行MapReduce任务的变换,生成最终的执行计划
Hive与关系数据库Mysql的区别
产品定位
Hive是数据仓库,是为海量数据的离线分析设计的,不支持OLTP(联机事务处理)所需的关键功能ACID,而更接近于OLAP(联机分析技术),适合离线处理大数据集;
而MySQL是关系型数据库,是为实时业务设计的。
可扩展性
Hive中的数据存储在HDFS(Hadoop的分布式文件系统),metastore元数据一般存储在独立的关系型数据库中,而MySQL则是服务器本地的文件系统;因此Hive具有良好的可扩展性,数据库由于ACID语义的严格限制,扩展性十分有限。
读写模式
Hive为读时模式,数据的验证则是在查询时进行的,这有利于大数据集的导入,读时模式使数据的加载非常迅速,数据的加载仅是文件复制或移动。MySQL为写时模式,数据在写入数据库时对照模式检查。写时模式有利于提升查询性能,因为数据库可以对列进行索引。
数据更新
Hive是针对数据仓库应用设计的,而数仓的内容是读多写少的,Hive中不支持对数据进行改写,所有数据都是在加载的时候确定好的;而数据库中的数据通常是需要经常进行修改的。
索引
Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键。Hive提供了有限的索引功能,可以为一些字段建立索引,一张表的索引数据存储在另外一张表中。由于数据的访问延迟较高,Hive不适合在线数据查询;数据库在少量的特定条件的数据访问中,索引可以提供较低的延迟。
计算模型
Hive使用的模型是MapReduce(也可以 on spark),而MySQL使用的是自己设计的Executor计算模
Hive的数据存储格式
Hive中的数据存储格式分为TextFile、SequenceFile和RCFile三种,其中TextFile是默认的存储格式,通过简单的分隔符可以对csv等类型的文件进行解析。而ORCFile是我们常用的一种存储格式,因为ORCFile是列式存储格式,更加适合大数据查询的场景。
Hive表类型
Hive几种基本表类型:内部表、外部表、分区表、分桶表。
内部表:内部表的数据,会存放在 HDFS 中的特定的位置中,我们在安装Hive的配置中是在/hive/warehouse。;当删除表时,数据文件也会一并删除;适用于临时创建的中间表
外部表:适用于想要在 Hive 之外使用表的数据的情况.当你删除 External Table 时,只是删除了表的元数据,它的数据并没有被删除。适用于数据多部门共享。建表时使用create external table。 指定external关键字即可。
分区表:分区表创建表的时候需要指定分区字段,分区字段与普通字段的区别:分区字段会在HDFS表目录下生成一个分区字段名称的目录,而普通字段则不会,查询的时候可以当成普通字段来使用,一般不直接和业务直接相关。
分桶表:将内部表,外部表和分区表进一步组织成桶表,可以将表的列通过Hash算法进一步分解成不同的文件存储。
对于内部表和外部表的概念和使用我们很容易理解,我们需要重点关注一下分区表和分桶表。我们为什么要建立分区表和分桶表呢?HQL通过where字句来限制条件提取数据,那么遍历一张大表,不如将这张大表拆分成多个小表,并通过合适的索引来扫描表中的一小部分,分区和分桶都是采用了这种理念。
分区会创建物理目录,并且可以具有子目录(通常会按照时间、地区分区),目录名以=创建,分区名会作为表中的伪列,这样通过where字句中加入分区的限制可以在仅扫描对应子目录下的数据。通过partitioned by(field1 type,…)
分桶可以继续在分区的基础上再划分小表,分桶根据哈希值来确定数据的分布(即MapReducer中的分区!),比如分区下的一部分数据可以根据分桶再分为多个桶,这样在查询时先计算对应列的哈希值并计算桶号,只需要扫描对应桶中的数据即可。通过 clustered by( field ) into n buckets
Hive自定义函数
当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数,Hive中包含三类自定义函数:
UDF:普通的用户自定义函数。接受单行输入,并产生单行输出。如转换字符串大小写,获取字符串长度等
UDAF:用户定义聚集函数(User-defined aggregate function)。接受多行输入,并产生单行输出。比如MAX,COUNT函数。
UDTF:用户定义表生成函数(User-defined table-generating function)。接受单行输入,并产生多行输出(即一个表),不是特别常用