概述:
hive是什么呢?
(1).由Facebook开源,最初用于解决海量结构化的日志数据统计问题
(2).是一个构建在Hadoop之上的数据仓库 (虽然是数据仓库,但是它并不存储任何数据)
(3).Hive定义了一种类似于SQL查询语言:HQL(非常类似于MySQL中的SQL语句,同时做了扩展)
(4).通常用于离线数据处理(与MapReduce原理一样,只不过它是将HQL语句转换成MapReduce程序运行)
(5).可以认为是一个HQL=>MapReduce的语言翻译器
(6).底层支持多种不同的执行引擎(默认是MapReduce)
(7).支持不同的压缩格式、存储格式以及自定义函数
(8).Hive中的数据库及表就是HDFS中的目录/文件夹,数据是文件,元数据信息可以存储在任意的一个关系型数据库中(比如:MySQL、SqlServer、Oracle等,默认是Derby),数据存储在HDFS中
Hive的工作原理简单来说就是一个查询引擎
HIve构建于Hadoop集群之上
1)HQL中对查询语句的解释、优化、查询都是由HIve完成的
2)所有的数据都是存储在Hadoop(HDFS)中
3)HQL语句全部转化为MapReduce任务,在Hadoop中执行,当然也有一些没有MR任务的如:select * from A
4)Hadoop和HIve都是采用UTF-8来进行编码的
Hive中的基本数据类型
红色部分为最常用
Hive中的复杂数据类型
由上图可见,Hive中有三种复杂的数据类型:Array Map Struct 其中Array 和Map与Java中Array和Map相似,
而Struct与C语言中的Struct类型,它封装了一个命名字段的集合,复杂数据类型允许任意层次的嵌套。
复杂数据类型的声明必须用尖括号声明其中的数据类型,参考如下:
CREATE TABLE A(
col1 ARRAY< INT>,
col2 MAP< STRING,INT>,
col3 STRUCT< a:STRING,b:INT,c:DOUBLE>
)
Hive架构图
Hive结构体系主要分为以下几个部分:
(1)用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至Hive Server。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。 WUI是通过浏览器访问Hive。
(2)Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
(3)解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。
(4)Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(包含*的查询,比如select * from tbl不会生成MapRedcue任务)。
Hive的执行命令:因为Hive是基于Hadoop之上的,我们首先启动Hadoop集群,然后去hive目录中bin/下的hiveserver2
[hadoop@Master hive]$ bin/hiveserver2
hiveserver2启动后,我们再去启动beeline命令,远程服务(默认端口号 10000)
[hadoop@Master hive]$ bin/beeline -u jdbc:hive2://Master:10000 -n hadoop
hive的远程服务端口号也可以在hive-default.xml文件中配置,修改hive.server2.thrift.port对应的值即可。
< property>
< name>hive.server2.thrift.port< /name>
< value>10000< /value>
< description>Port number of HiveServer2 Thrift interface when hive.server2.transport.mode is 'binary'.< /description>
< /property>
Hive数据存储的概念:
1、Hive中所有的数据都存储在 HDFS 中,没有专门的数据存储格式(可支持Text,SequenceFile,ParquetFile,RCFILE等)
2、只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。
3、Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket。
(1):db:在hdfs中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
(2):table:在hdfs中表现所属db目录下一个文件夹
(3):external table:外部表, 与table类似,不过其数据存放位置可以在任意指定路径
普通表: 删除表后, hdfs上的文件都删了
External外部表删除后, hdfs上的文件没有删除, 只是把文件删除了
(4): partition:在hdfs中表现为table目录下的子目录
(5):bucket:桶, 在hdfs中表现为同一个表目录下根据hash散列之后的多个文件, 会根据不同的文件把数据放到不同的文件中
写到这里,我们开始真正进入到Hive来进行实际的操作,如果大家学过SQL语句的话会感觉到很简单,基本相同。
创建数据库:Create
Create database mydb; //创建一个数据库 //对应的HDFS路径为:/user/hive/warehouse/mydb.db
是否存在关键字:if not exists