(一)Hive的基础知识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15783243/article/details/81907749

一.Hive是什么

Hive是一个数据仓库基础工具,可以在Hadoop中用来处理结构化数据。它架构在Hadoop之上,总归为大数据,并使得查询和分析方便。Hive作为一个中间工具,主要作用是将HQL(Hive Query Language)转换为一系列的MapReduce Job,利用Hadoop框架对数据进行类SQL处理,简化在Hadoop框架上实现SQL功能程序的编写。 
Hive擅长的是非实时的、离线的、对响应及时性要求不高的海量数据批量计算,即席查询,统计分析。

二.Hive的特点

1、Hive存储架构在一个数据库中并处理数据到HDFS. 
Hadoop想要充分发挥其分布式特性,就需要底层分布式文件系统HDFS的支持。因此,只有将数据保存在HDFS当中才能充分发挥Hadoop的优势。 
2、 Hive为OLAP(联机分析处理)设计。 
Hive将数据加载到HDFS之后,需要提供对数据进行组织管理的功能。这就是和普通HDFS存储文件的区别。 
3、Hive提供将HQL(Hive Query Lanuage)转化成MapReduce Job的功能

三.Hive-Hadoop工作流程

1 Execute Query 
Hive接口,如命令行或Web UI发送查询驱动程序(任何数据库驱动程序,如JDBC,ODBC等)来执行。 
2 Get Plan 
在驱动程序帮助下查询编译器,分析查询检查语法和查询计划或查询的要求。 
3 Get Metadata 
编译器发送元数据请求到Metastore(任何数据库)。 
4 Send Metadata 
Metastore发送元数据,以编译器的响应。 
5 Send Plan 
编译器检查要求,并重新发送计划给驱动程序。到此为止,查询解析和编译完成。 
6 Execute Plan 
驱动程序发送的执行计划到执行引擎。 
7 Execute Job 
在内部,执行作业的过程是一个MapReduce工作。执行引擎发送作业给JobTracker,在名称节点并把它分配作业到TaskTracker,这是在数据节点。在这里,查询执行MapReduce工作。 
7.1 Metadata Ops 
与此同时,在执行时,执行引擎可以通过Metastore执行元数据操作。 
8 Fetch Result 
执行引擎接收来自数据节点的结果。 
9 Send Results 
执行引擎发送这些结果值给驱动程序。 
10 Send Results 
驱动程序将结果发送给Hive接口。

四.Hive的数据组织和类型

1.数据组织 
(1)元数据 
Hive中的元数据包括表的名字表的列分区及其属性表的属性(是否为外部表等)表的数据所在目录等。 由于Hive的元数据需要不断的更新、修改,而HDFS系统中的文件是多读少改的,这显然不能将Hive的元数据存储在HDFS中。目前Hive将元数据存储在数据库中,如Mysql、Derby中。 
(2)Databases:数据库。 
(3)Tables:表。 
内部表:Hive中的表和关系型数据库中的表在概念上很类似,每个表在HDFS中都有相应的目录用来存储表的数据,这个目录可以通过/conf/hive-site.xml配置文件中的hive.metastore.warehouse.dir属性来配置,这个属性默认的值是在HDFS上的/user/hive/warehouse,所有的Hive内部表存储在这个位置。 
外部表: 
Hive中的外部表和表很类似,但是其数据不是放在自己表所属的目录中,而是存放到别处,这样的好处是如果你要删除这个外部表,该外部表所指向的数据是不会被删除的,它只会删除外部表对应的元数据而如果你要删除内部表,该表对应的所有数据包括元数据都会被删除。 
(4)Partitions:分区 
Hive可以对数据按照某列或者某些列进行分区管理,将数据组织成分区,每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。 
这样可以提高数据的查询速度。至于用户存储的每一条记录到底放到哪个分区,由用户决定。即用户在加载数据的时候必须显示的指定该部分数据放到哪个分区。 
Buckets (or Clusters):分桶 
Hive可以对于每一个表或者分区组织成桶。Hive也是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。采用桶能够带来一些好处,比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。 
2.数据类型 
(1)整型 

类型 说明 后缀 例子 备注
TINYINT 微整型 Y 100Y 只占用1个字节,只能存储0-255的整数。
SMALLINT 小整型 S 100S 占用2个字节,存储范围–32768 到 32767。 
INT 整型     占用4个字节,存储范围-2147483648到2147483647。 
BIGINT 长整型 L 100L 占用8个字节,存储范围-2^63到2^63-1。 

(2)小数

浮点类型包括FLOAT和DOUBLE两种,对应到Java的float和double,分别为32位和64位浮点数。DECIMAL用于表示任意精度的小树,类似于Java的BigDecimal,通常在货币当中使用。

(3)文本类型

Hive有3种类型用于存储字文本。STRING存储变长的文本,对长度没有限制。理论上将STRING可以存储的大小为2GB,但是存储特别大的对象时效率可能受到影响,可以考虑使用Sqoop提供的大对象支持。VARCHAR与STRING类似,但是长度上只允许在1-65355之间。例如VARCHAR(100).CHAR则用固定长度来存储数据。
(4)布尔型 
BOOLEAN — TRUE/FALSE 

(5)BINARY           从Hive0.8.0开始支持

(6)时间类型

TIMESTAMP(从Hive0.8.0开始支持)则存储纳秒级别的时间戳,同时Hive提供了一些内置函数用于在TIMESTAMP与Unix时间戳(秒)和字符串之间做转换。例如:

cast(date as date)

cast(timestamp as date)

cast(string as date)

cast(date as string)

 DATE      DATE类型则表示日期,对应年月日三个部分。       从Hive0.12.0开始支持

(7)复杂类型

Hive有4种复杂类型的数据结构:ARRAY、MAP、STRUCT、UNION。

ARRAY和MAP

ARRAY和MAP类型与Java中的数据和映射表。数组的类型声明格式为ARRAY<data_type>,元素访问通过0开始的下标,例如arrays[1]访问第二个元素。 
MAP通过MAP<primitive_type,data_type>来声明,key只能是基本类型,值可以是任意类型。map的元素访问则使用[],例如map['key1'].
Structs:

STRUCT则封装一组有名字的字段(named filed),其类型可以是任意的基本类型,元素的访问使用点号。比如,定义一个字段C的类型为STRUCT {a INT; b STRING},则可以使用a和C.b来获取其中的元素值; 
UNION:

UNION则类似于C语言中的UNION结构,在给定的任何一个时间点,UNION类型可以保存指定数据类型中的任意一种。类型声明语法为UNIONTYPE<data_type,data_type,…>。每个UNION类型的值都通过一个整数来表示其类型,这个整数位声明时的索引,从0开始。例如:

CREATE TABLE union_test(foo UNIONTYPE<int,double,array<string>,strucy<a:int,b:string>>);

oo的一些取值如下:

{0:1} {1:2.0} {2:["three" , "four"]} {3:["a":5,b:"five"]} {0:9}

下面的这个CRATE语句用到了这4中复杂类型:

CREATE TABLE complex ( c1 ARRAY<INT>, c2 MAP<STRING,INT>, c3 STRUCT<a:STRING,b:INT,c:DOUBLE>, c4 UNIONTYPE<STRING,INT> );

参考资料 
http://www.yiibai.com/hive/ 
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21142030&id=5751435 
http://www.aboutyun.com/thread-7414-1-1.html

猜你喜欢

转载自blog.csdn.net/qq_15783243/article/details/81907749
今日推荐