Hive原理及其使用(六)


【Task6】Hive原理及其使用
安装MySQL、Hive
采用MySQL作为hive元数据库
Hive与传统RDBMS的区别
HIve原理及架构图
HQL的基本操作(Hive中的SQL)
Hive内部表/外部表/分区

参考资料:

https://www.shiyanlou.com/courses/running

MySQL安装

采用MySQL作为hive元数据库

Hive on Spark环境部署

https://blog.csdn.net/qq_26937525/article/details/54136317

https://docs.azure.cn/zh-cn/hdinsight/hadoop/python-udf-hdinsight

1. 安装MySQL、Hive

还好这一部分前面已经完成了,放上链接

Hive 0.13.1安装

基本步骤如下:
1)上传hive压缩包并解压缩、重命名

2)修改环境变量,添加hive的bin目录,让配置生效

3)然后安装mysql

2. 采用MySQL作为hive元数据库

放上链接:Hive 0.13.1安装

3. Hive与传统RDBMS的区别

RDBMS的概念

RDBMS 指的是关系型数据库管理系统。
RDBMS 是SQL 的基础,同样也是所有现代数据库系统的基础,比如MS SQL Server, IBM DB2, Oracle, MySQL 以及Microsoft Access。
RDBMS 中的数据存储在被称为表(tables)的数据库对象中。
表是相关的数据项的集合,它由列和行组成

RDBMS的特点

1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database

在这里插入图片描述
Hive 具有 SQL 数据库的外表,但应用场景完全不同,Hive 只适合用来做海量离线数 据统计分析,也就是数据仓库。

  1. 查询语言。由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发。

  2. 数据存储位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统中。

  3. 数据格式。Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,因此,Hive 在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,RDBMS数据库加载数据的过程会比较耗时。

  4. 数据更新。由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET 修改数据。

  5. 索引。之前已经说过,Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些 Key 建立索引。Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适合在线数据查询。
    执行。Hive 中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的(类似 select * from tbl 的查询不需要 MapReduce)。而数据库通常有自己的执行引擎。

  6. 执行延迟。之前提到,Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟,因此在利用 MapReduce 执行 Hive 查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。hive执行延迟高,只有在数据规模达到一定程度后,其查询的高效才能弥补其高延迟的劣势。

  7. 可扩展性。由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可扩展性是和 Hadoop 的可扩展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009年的规模在 4000 台节点左右)。而数据库由于 ACID 语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有 100 台左右。
    数据规模。由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

Hive 与 RDBMS的区别

https://blog.csdn.net/liuxingjiaofu/article/details/7027048

https://blog.csdn.net/zx8167107/article/details/79114620

Hive学习之路 (一)Hive初识

4. Hive原理及架构图

在这里插入图片描述
从上图看出hive的内部架构由四部分组成:

1、用户接口: shell/CLI, jdbc/odbc, webui Command Line Interface

CLI,Shell 终端命令行(Command Line Interface),采用交互形式使用 Hive 命令行与 Hive 进行交互,最常用(学习,调试,生产)

JDBC/ODBC,是 Hive 的基于 JDBC 操作提供的客户端,用户(开发员,运维人员)通过 这连接至 Hive server 服务

Web UI,通过浏览器访问 Hive

2、跨语言服务 : thrift server 提供了一种能力,让用户可以使用多种不同的语言来操纵hive

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

3、底层的Driver: 驱动器Driver,编译器Compiler,优化器Optimizer,执行器Executor

Driver 组件完成 HQL 查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行 计划的生成。生成的逻辑执行计划存储在 HDFS 中,并随后由 MapReduce 调用执行

Hive 的核心是驱动引擎, 驱动引擎由四部分组成:

(1) 解释器:解释器的作用是将 HiveSQL 语句转换为抽象语法树(AST)

(2) 编译器:编译器是将语法树编译为逻辑执行计划

(3) 优化器:优化器是对逻辑执行计划进行优化

(4) 执行器:执行器是调用底层的运行框架执行逻辑执行计划

4、元数据存储系统 : RDBMS MySQL

元数据,通俗的讲,就是存储在 Hive 中的数据的描述信息。

Hive 中的元数据通常包括:表的名字,表的列和分区及其属性,表的属性(内部表和 外部表),表的数据所在目录

Metastore 默认存在自带的 Derby 数据库中。缺点就是不适合多用户操作,并且数据存 储目录不固定。数据库跟着 Hive 走,极度不方便管理

解决方案:通常存我们自己创建的 MySQL 库(本地 或 远程)

Hive 和 MySQL 之间通过 MetaStore 服务交互

执行流程

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

5. HQL的基本操作(Hive中的SQL)

HQL的基本命令(全):

1、查看数据库

show databases;  //查看已经存在的数据库

describe database test;   //查看某个已经存在的数据库

2、创建数据库

create database test;

create database if not exists test;

create database test2 location '/user/hadoop/temp';  //制定数据库创建的目录

3、删除数据库

drop database if exists test1 cascade;

4、切换当前工作的数据库

use test2;

5、查看数据库中的表

show tables;         //查看当前工作的数据库中的表

show tables in test3;   //查看数据库test3中的表

6、创建表

 create table if not exists test.student(

    name string comment 'student name',

    age int comment 'student age',

    course array<string>,

    body map<string,float>,

    address struct<street:string,city:string,state:string>
    )

     comment 'the info of student'                 //表的备注

     row format delimited fields terminated by '\001'  //指定列分隔符’\001’

     collection items terminated by '\002'           //指定集合元素间的分隔符’\002’

     map keys terminated by '\003'                //指定类型为MAP字段的键值对分割符


    lines terminated by '\n'                      //指定行分割符

    stored as textfile                           //存储的文件格式

    location '/user/hive/warehouse/test.db/student';   



create table if not exists test.student(

   id string comment 'student id',

   name string comment 'student name',

   sex string comment 'student sex',

   age int comment 'student age'

   )

   comment 'the info of student'                

   row format delimited fields terminated by '\t'                 

   lines terminated by '\n'                      

   stored as textfile;   
create table if not exists student2 like student;   //复制已存在的表结构创建表(不复制数据)
   
   Hive中建表默认为管理表(managed table),当表需要被其它工具分析时,需要建立外部表(exter nal table)
    
   create exter nal table --    //建立外部表
建立分区表
create table student_info(

  id string,

  name string,

  age int)

  partitioned by (province string,city string);

7、查看表结构信息以及列的注释

   desc student;

8、查看表的详细信息

   desc formatted student;

9、查看分区表的详细信息

   describe extended student_info;

10、删除表

drop table student;

drop table if exists student;

11、表重命名

alter table student rename to student_1;

12、增加、修改、删除分区

alter table student_info add partition (province='fujain',city='fuzhou') location  

'/user/hive/warehouse/test/fujian/fuzhou'; //表必须为分区表,且province、city为分区字段
alter table student_info drop partition(province='fujian',city='fuzhou');

13、修改列信息

alter table student_1

change column age sage int

comment 'the student age'

after name;

14、增加列

alter table student_1 add columns (new_col int);

15、装载数据

load data local inpath '/home/hadoop/student_1' into table student;    // 从本地加载数据

load data inpath '/home/hadoop/student_1' into table student;    // 从HDFS上加载数据

16、通过查询语句向表中插入语句:

insert overwrite table student2 select * from student;

17、导出数据:

insert overwrite directory '/hive_tmp' select * from student2;

insert overwrite local directory '/home/hadoop/hive_tmp' select * from student2;

18、简单查询语句:

select id,name,age from student;

select id,name,age from student limit 3;

19、在查询语句中对表数据进行简单处理:

select id,name,

case

when age ='10' then '10岁'

when age='12' then '12岁'

else age

end

from student;

20、查询语句中添加条件:

select id,name,age from student where age >13;

select id,name,age from student where age >13 or id <1002;

21、Group by 语句:

select age,count(*) from student group by age;

select age,count(*) from student group by age having age>12;

24、Join 语句

select t1.id,t2.id from student t1 join score t2 on t1.id = t2.id;   //内连接

select t1.id,t2.id from student t1 left outer join score t2 on t1.id = t2.id; //左连接

select t1.id,t2.id from student t1 right outer join score t2 on t1.id = t2.id; //右连接

select t1.id,t2.id from student t1 full outer join score t2 on t1.id = t2.id; //全外连接

select t1.id,t2.id from student t1 left semi join score t2 on t1.id = t2.id; //左半连接

select /*+mapjoin(t1)*/ t1.id,t2.id from student t1 join score t2 on t1.id = t2.id;//map端连接

25、排序语句:

select id,name,sex,age from student order by age asc,id desc;

26、分桶和抽样:

select * from student tablesample(bucket 1 out of 3 on id);

select * from student tablesample(bucket 1 out of 3 on rand());

27、Union All

select t.id

from(

select t1.id from student t1

union all

select t2.id from score t2) t;

Hive的HQL的基本操作

6. Hive内部表/外部表/分区

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

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

3、 只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据

Hive 的默认列分隔符:控制符 Ctrl + A,\x01 Hive 的

Hive 的默认行分隔符:换行符 \n

4、Hive 中包含以下数据模型:

database:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹

table:在 HDFS 中表现所属 database 目录下一个文件夹

external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径

partition:在 HDFS 中表现为 table 目录下的子目录

bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散 列之后的多个文件

view:与传统数据库类似,只读,基于基本表创建

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

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

内部表和外部表的区别:

删除内部表,删除表元数据和数据

删除外部表,删除元数据,不删除数据

内部表和外部表的使用选择:

大多数情况,他们的区别不明显,如果数据的所有处理都在 Hive 中进行,那么倾向于 选择内部表,但是如果 Hive 和其他工具要针对相同的数据集进行处理,外部表更合适。

使用外部表访问存储在 HDFS 上的初始数据,然后通过 Hive 转换数据并存到内部表中

使用外部表的场景是针对一个数据集有多个不同的 Schema

通过外部表和内部表的区别和使用选择的对比可以看出来,hive 其实仅仅只是对存储在 HDFS 上的数据提供了一种新的抽象。而不是管理存储在 HDFS 上的数据。所以不管创建内部 表还是外部表,都可以对 hive 表的数据存储目录中的数据进行增删操作。

分区表和分桶表的区别:

Hive 数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同 时表和分区也可以进一步被划分为 Buckets,分桶表的原理和 MapReduce 编程中的 HashPartitioner 的原理类似。

分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于 Hive 是读模式,所 以对添加进分区的数据不做模式校验,分桶表中的数据是按照某些分桶字段进行 hash 散列 形成的多个文件,所以数据的准确性也高很多

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值