hive框架原理
一、hive基础
Hive是一个基于Hadoop的数据仓库,使用HQL作为查询接口、HDFS作为存储底层、mapReduce作为执行层,设计目的是让SQL技能良好,但不熟悉MapReduce 、Java技能较弱的分析师可以查询海量数据。Hive提供了比较完整的SQL功能(本质是将SQL转换为MapReduce),自身最大的缺点就是执行速度慢(因为实际执行就是一系列的MapReduce作业,而MapReduce中间结果都存储在磁盘,IO导致速度很慢。所有也有基于spark的hive项目:hive on spark)。Hive有自身的元数据结构描述,可以使用MySql\ProstgreSql\oracle 等关系型数据库来进行存储,但请注意Hive中的所有数据都存储在HDFS中。
Hive本质上可以理解为一个客户端工具,一个将sql语句解析成MapReduce作业的引擎,随后就是一般的在Hadoop上面运行MapReduce作业。Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce。 Hive又作为一种数据仓库系统,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,Hive可以把SQL中的表、字段转换为HDFS中的目录、文件。Hive将表中的元数据信息存储在数据库中,如derby(自带的)、Mysql(实际工作中配置的),Hive中的元数据信息包括表的名字、表的列和分区、表的属性(是否为外部表等)、表的数据所在的目录等。Hive中的解析器在运行的时候会读取元数据库MetaStore中的相关信息。
二、hive基础表操作
1、Hive中的两种表概念:
1.1、内部表(managed table),数据文件、统计文件、元数据都由Hive自己管理,换句话说,这个表数据存储在哪里我们不用关心,也不用提供,Hive默认存储在HDFS。Hive能管理原始数据的整个生命周期。Hive表删除后,数据也随之删除。
如果我们没有数据文件,只是想创建一个Hive表,这个Hive表以后用于存储数据用,或从其他数据源导入,或程序写入等。内部表看起来就像RDBMS的数据表,Hive有足够大的权限可以操纵表里的数据,包括删除。
创建外部表时,使用的语句是create external table。而默认情况下,不使用external则是默认创建内部表。
create table tb (id int, name String, age int) row format delimited # 一行文本对应表中一条记录 fields terminated by '\t'; # 指定输入字段的间隔符
1.2、外部表(external table),数据文件存储在其他系统中,可能是HDFS,也可能是HBase、ASV等,Hive只保留映射关系,但Hive表删除后,数据不会丢失,仍然存在于其他系统中。
create external table lang ( id int, name string, field1 int) row format delimited fields terminated by ',' lines terminated by '\n' stored as textfile # 声明存储的文件为什么格式 location "/ez/example/lang.csv" # 指定建立外部表的文件系统连接
1.3、分区表
分区是将HDFS中不同分区的数据文件存放于不同的目录下。例如一个Hive内部表数据保存于HDFS中/user/hive/warehouse/mytest.db/下,这个目录下全是数据文件(可能是文本文件格式,也可能是其他格式,根据file_format指定)。这时候若引入一个字段用于分区,则将会在这个目录下产生新的目录,每个目录对应一个分区。每个分区数据分别存在自己对应的目录下。这样查询效率也会更高。
create table partition_tb ( id int, col1 string, col2 string) partitioned by (type int) stored as ORC
为表做分区主要考虑的是效率问题,重点需要考虑分区的列的基数(也就是该列包含唯一值的个数)。选择基数很高的列来做分区会导致数据严重的碎片化。不要对数据过分的分区。如果有太多的小分区,那么对这么多的分区目录进行扫描代价也是比较高的,甚至可能比全表扫描还高。