Hive基础知识

来源:互联网 发布:linux ping 显示丢包 编辑:程序博客网 时间:2024/06/06 08:56

1、Hive基础概念

1.1、Hive简介

Hive是由Facebook实现并开源,是基于Hadoop的一个数据仓库工具,可以将结构化的数据映射到一张数据库表,并提供HQL(Hive SQL)查询功能,底层数据是存储在HDFS上。Hive的本质是将SQL语句转换为MapReduce任务运行,使不熟悉MapReduce的用户很方便的利用HQL处理和计算HDFS上的结构化数据,适用于离线的批量数据计算。

为什么使用Hive?
操作接口采用SQL语法,提供快速开发的能力,避免写MapReduce,减少开发人员的学习成本,可以扩展集群规模而无需重启服务,还支持用户自定义函数。

     Hive特点:
优点:可扩展性,横向扩展
延展性
良好的容错性
缺点: Hive不支持记录级别的增删改操作
Hive的查询延时严重

Hive不支持事物(因为没有增删改,所以主要用来做OLAP(联机分析处理),而不是OLTP(联机事物处理),这就是数据处理的两大级别)。


1.2、Hive架构


基本组成:
1)用户接口
CLI:shell终端命令行(Command Line Interface),采用交互形式使用hive命令行与hive进行交互,最常用学习调试生产。
JDBC/ODBC:是Hive的基于JDBC操作提供的客户端,用户(开发员、运维人员)通过这连接至Hive server服务。
Web UI:通过浏览器访问Hive。


2)Thrift Server
Thrift是Facebook开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,Hive集成了该服务,能让不同的编程语言调用hive的接口。


3)元数据储存
元数据,通俗的讲,就是储存在Hive中的数据描述信息
Hive中的的元数据通常包括:表的名字,表的列和分区及其属性,表的属性(内部表和外部表),表的数据所在目录。
Metastore默认存在自带的Derby数据库中。缺点就是不适合多用户操作,并且数据存储目录不固定,数据库跟着Hive走,极度不方便管理。


4)Driver编译器(Compiler),优化器(Optimizer),执行器(Executor)
Driver组件完成HQL查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行计划的生成。生成的逻辑执行计划存储在HDFS中,并随后又MapReduce调用执行。
Hive的核心是驱动引擎,驱动引擎由四部分组成:
解释器:将HiveSQL语句转换为抽象语法树(AST)
编译器:将语法树编译为逻辑执行计划
优化器:对逻辑执行计划进行优化
执行器:调用底层的运行框架执行逻辑执行计划


5)执行流程:
HiveHQL通过命令行或者客户端提交,经过Compiler编译器,运用MetaStore中的元数据进行类型检测和语法分析,生成一个逻辑方案(Logical Plan),然后通过的优化处理,产生一个MapReduce任务。

1.3、Hive和RDBMS对比


总结:Hive就有SQL数据库的外表,但应用场景完全不同,Hive只适合用来做海量离线数据统计分析,也就是数据仓库。

1.4Hive的数据储存

1)hive的存储结构包括数据库、表、视图、分区和表数据等。数据库,表,分区等等都对应HDFS上的一个目录。表数据对应HDFS对应目录下的文件。

2)Hive中所有的数据都存储在HDFS中,没有专门的数据存储格式,因为Hive是读模式,可支持TextFile,SequenceFile,RCFile或者自定义格式。

3)只需要在创建表的时候,告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据
Hive的默认列分隔符:控制符 Ctrl+A,\x01
Hive的默认行分隔符:换行符 \n

4)Hive中包含以下数据模型:
database:在HDFS中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
table:在HDFS中表现所属database目录下一个文件夹
external talbe:与table类似,不过其数据存放位置可以指定任意HDFS目录路径
partition:在HDFS中表现为table目录下的子目录
bucket:在HDFS中表现为同一个表目录或者分区目录下根据某个字段的值进行hash散列之后的多个文件。
view:与传统数据库类似,制度,基于基本表创建。

5)Hive的元数据存储在RDBMS中,除元数据外的其他所有数据都基于HDFS存储,默认情况下,Hive元数据保存在内嵌的Derby数据库中只能允许一个会话连接,只适合简单测试。为了支持多会话,则需要一个独立的元数据库,使用MySQL作为元数据库,Hive内部对MySQL提供了很好的支持。

6)Hive中的表分为内部表、外部表、分区表、Bucket表

内部表和外部表的区别
删除内部表,删除表元数据和真实数据
删除外部表,删除元数据,不删除真实数据

内部表和外部表的使用选择
大多数情况他们的区别不明显,如果数据的所有处理都在Hive中进行,name倾向于选择内部表,但是如果Hive和其他工具要针对相同的数据集进行处理,外部表更合适。
使用外部表访问存储在HDFS上的初始数据,然后通过Hive转换数据并存到内部表中使用外部表的场景是针对一个数据集有多个不同的Schema。

分区表和分桶表
Hive数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同时表和分区也可以进一步被划分为Buckets,分桶表的原理和MR程序的HashPartitioner的原理类似
分区和分桶都是细化数据管理,到那时分区表是手动添加分区,由于Hive是读模式,所以对添加进分区的数据不做模式校验,分桶表中的数据是按照某些分桶字段进行hash散列形成的多个文件,所以数据的准确性也高很多。

2、Hive基本使用

创建库 create database mydb;
查看库 show databases;
切换数据库 use mydb;
创建表 create table t_user(id string ,name string)
create table t_user2(id string ,name string) row format delimited fields terminated by',';
插入数据 insert into tables t_user values('001','name')
查询数据 select * from t_user;
导入数据 导入HDFS数据:load data inpath '/mingxing.txt' into table t_user1;
导入本地数据库:load data local inpath '/root/hivedata/mingxing.txt' into table t_user1;
显示表头 set hive.cli.print.header=true


原创粉丝点击