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 

为表做分区主要考虑的是效率问题,重点需要考虑分区的列的基数(也就是该列包含唯一值的个数)。选择基数很高的列来做分区会导致数据严重的碎片化。不要对数据过分的分区。如果有太多的小分区,那么对这么多的分区目录进行扫描代价也是比较高的,甚至可能比全表扫描还高。

 

posted @ 2018-05-13 09:45  hugh_tan  阅读(1158)  评论(0编辑  收藏  举报