一、了解Hive
1、Hive的概念及架构
Hive是建立在Hadoop上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive定义了简单的类SQL查询语言,称为HQL,它允许熟悉SQL的用户查询数据。同时,这个语言也允许熟悉MapReduce的开发者开发自定义的mapper和reducer来处理内建的mapper和reducer无法完成的复杂的分析工作。
「Hive是SQL解析引擎」,它将SQL语句转译成Map/ReduceJob然后在Hadoop执行。「Hive的表其实就是HDFS的目录」,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在Map/ReduceJob里使用这些数据。
「Hive相当于hadoop的客户端工具」,部署时不一定放在集群管理节点中,也可以放在某个节点上。
「数据仓库」,英文名称为「DataWarehouse」,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它出于分析性报告和决策支持目的而创建。为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。
Hive的版本介绍:0.13和.14版本,稳定版本,但是不支持更新删除操作。1.2.1和1.2.2版本,稳定版本,为Hive2版本(是主流版本)1.2.1的程序只能连接hive1.2.1的hiveserver2
2、Hive与传统数据库比较
查询语言。类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。
数据存储位置。所有Hive的数据都是存储在HDFS中的。而数据库则可以将数据保存在块设备或者本地文件系统中。
数据格式。Hive中没有定义专门的数据格式。而在数据库中,所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。
数据更新。Hive对数据的改写和添加比较弱化,0.14版本之后支持,需要启动配置项。而数据库中的数据通常是需要经常进行修改的。
索引。Hive在加载数据的过程中不会对数据进行任何处理。因此访问延迟较高。数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了Hive不适合在线数据查询。
执行计算。Hive中执行是通过MapReduce来实现的而数据库通常有自己的执行引擎。
数据规模。由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。
3、Hive的数据存储格式
Hive的数据存储基于HadoopHDFS。
Hive没有专门的数据文件格式,常见的有以下几种:TEXTFILE、SEQUENCEFILE、AVRO、RCFILE、ORCFILE、PARQUET。
「下面我们详细的看一下Hive的常见数据格式:」
「TextFile:」
「TEXTFILE即正常的文本格式,是Hive默认文件存储格式」,因为大多数情况下源数据文件都是以text文件格式保存(便于查看验数和防止乱码)。此种格式的表文件在HDFS上是明文,可用hadoopfs-cat命令查看,从HDFS上get下来后也可以直接读取。「TEXTFILE存储文件默认每一行就是一条记录,可以指定任意的分隔符进行字段间的分割。但这个格式无压缩,需要的存储空间很大」。虽然可以结合Gzip、Bzip2、Snappy等使用,使用这种方式,Hive不会对数据进行切分,从而无法对数据进行并行操作。「一般只有与其他系统由数据交互的接口表采用TEXTFILE格式,其他事实表和维度表都不建议使用。」
「RCFile」:
「RecordColumnar的缩写。是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能。通常写操作比较慢」,比非列形式的文件格式需要更多的内存空间和计算量。「RCFile是一种行列存储相结合的存储方式」。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。
「ORCFile」:
Hive从0.11版本开始提供了ORC的文件格式,「ORC文件」不仅仅是「一种列式文件存储格式」,最重要的是「有着很高的压缩比」,并且「对于MapReduce来说是可切分(Split)的」。因此,「在Hive中使用ORC作为表的文件存储格式,不仅可以很大程度的节省HDFS存储资源,而且对数据的查询和处理性能有着非常大的提升」,因为ORC较其他文件格式压缩比高,查询任务的输入数据量减少,使用的Task也就减少了。「ORC能很大程度的节省存储和计算资源,但它在读写时候需要消耗额外的CPU资源来压缩和解压缩」,当然这部分的CPU消耗是非常少的。
「Parquet:」
通常我们使用关系数据库存储结构化数据,而「关系数据库中使用数据模型都是扁平式的」,遇到诸如List、Map和自定义Struct的时候就需要用户在应用层解析。但是在大数据环境下,通常数据的来源是服务端的埋点数据,很可能需要把程序中的某些对象内容作为输出的一部分,而每一个对象都可能是嵌套的,所以如果能够原生的支持这种数据,这样在查询的时候就不需要额外的解析便能获得想要的结果。
Parquet的灵感来自于年Google发表的Dremel论文,文中介绍了一种支持嵌套结构的存储格式,并且使用了列式存储的方式提升查询性能。「Parquet仅仅是一种存储格式,它是语言、平台无关的,并且不需要和任何一种数据处理框架绑定。这也是parquet相较于orc的仅有优势:支持嵌套结构」。Parquet没有太多其他可圈可点的地方,比如他「不支持update操作(数据写成后不可修改),不支持ACID等.」
「SEQUENCEFILE」:
「SequenceFile是HadoopAPI提供的一种二进制文件,它将数据以key,value的形式序列化到文件中」。这种二进制文件内部使用Hadoop的标准的Writable接口实现序列化和反序列化。它与HadoopAPI中的MapFile是互相兼容的。Hive中的SequenceFile继承自HadoopAPI的SequenceFile,不过它的key为空,使用value存放实际的值,这样是为了避免MR在运行map阶段的排序过程。「SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。SequenceFile最重要的优点就是Hadoop原生支持较好,有API」,但除此之外平平无奇,实际生产中不会使用。
「AVRO:」
「Avro是一种用于支持数据密集型的二进制文件格式。它的文件格式更为紧凑」,若要读取大量数据时,Avro能够提供更好的序列化和反序列化性能。并且「Avro数据文件天生是带Schema定义的」,所以它不需要开发者在API级别实现自己的Writable对象。「Avro提供的机制使动态语言可以方便地处理Avro数据」。最近多个Hadoop子项目都支持Avro数据格式,如Pig、Hive、Flume、Sqoop和Hcatalog。
其中的「TextFile」、「RCFile」、「ORC」、「Parquet」为Hive「最常用的四大存储格式」它们的存储效率及执行速度比较如下:ORCFile存储文件读操作效率最高,耗时比较(ORCParquetRCFileTextFile)ORCFile存储文件占用空间少,压缩效率高(ORCParquetRCFileTextFile)
4、Hive操作客户端
「常用的客户端有两个:CLI,JDBC/ODBC」
CLI,即Shell命令行
JDBC/ODBC是Hive的Java,与使用传统数据库JDBC的方式类似。
「Hive将元数据存储在数据库中(metastore),目前只支持mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等;由解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成。生成的查询计划存储在HDFS中,并在随后由MapReduce调用执行。」
「Hive的数据存储在HDFS中,大部分的查询由MapReduce完成(包含*的查询,比如select*fromtable不会生成MapRedcue任务)」
「Hive的metastore」
metastore是hive元数据的集中存放地。metastore默认使用内嵌的derby数据库作为存储引擎Derby引擎的缺点:一次只能打开一个会话使用MySQL作为外置存储引擎,可以多用户同时访问`
二、Hive的基本语法
1、Hive建表语法
CREATE[EXTERNAL]TABLE[IFNOTEXISTS]table_name
//定义字段名,字段类型
[(col_namedata_type[COMMENTcol_