当前位置:   article > 正文

初识Hive(一) — 基本概念|架构原理|运行机制|DDL命令_hive运行机制

hive运行机制

Hive 速览

1 Hive基本概念

Hive:由 Facebook 开源用于解决海量结构化日志的数据统计
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能。

本质是:将 HQL 转化成 MapReduce 程序

1.1 HQL 转换 MR 流程

因为数据仓库需要更加便捷的方式(SQL)对大量数据进行统计,

因此就将SQL语言所常用操作(Select,Where,Group等)用MapReduce写成模板,并将MapReduce模板封装在Hive中,以备客户端使用。

客户端的用户根据业务需求编写相应的SQL语句,而此时Hive会通过用户输入的SQL语句匹配出相应MR模板,并运行MapRduce程序,最后生成相应的分析结果。

1)Hive 处理的数据存储在HDFS

2)执行程序运行在Yarn上

Hive是完全基于Hadoop(HDFS,MR,YARN)之上。

在这里插入图片描述

1.2 Hive 优缺点

1.2.1 优点

1)操作接口采用类SQL语法,提供快速开发的能力。

2)避免了去写MR程序。

3)Hive的执行延迟比较高,因此使用常用于数据分析,对实时性不高的场合。

4)Hive优势在处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较高。

5)Hive 支持用户自定义函数,如UDF,UDTF函数,用户可以根据自己的需求来实现自己的函数。

1.2.2 缺点

1. Hive 的 HQL 表达能力有限

  • 迭代式算法无法表达
  • 数据挖掘方面不擅长

2. Hive 的效率比较低

  • Hive 自动生成的 MapReduce 作业,通常情况下不够智能化
  • Hive 调优比较困难,粒度较粗

1.3 Hive 架构原理

  1. 用户接口:Client

    可以通过三种方式来访问Hive

    1)CLI(Hive Shell)

    2)JDBC(java 访问 hive)

    3)WEBUI(浏览器访问hive)

  2. 元数据:Metastore

    元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/ 分区字段、表的类型(是否是外部表)、表的数据所在目录等;

默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储 Metastore

不推荐Derby数据库,是因为Derby数据库无法多用户访问。

  1. Hadoop

    使用HDFS进行存储,使用MapReduce进行计算。

  2. 驱动器:Driver

    1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、 SQL 语义是否有误。

    2)编译器(Physical Plan):将AST编译生成逻辑执行计划

    3)优化器(Query Optimizer):将逻辑执行计划进行优化

    4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划,对于Hive来说,就是MR/Spark。
    在这里插入图片描述

1.4 Hive运行机制

Hive 通过给用户提供了一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(Metastore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。

在这里插入图片描述

元数据(Metastore):即查询数据映射到 HDFS 中存放文件的路径(path)以及表的相关信息。

在这里插入图片描述

1.5 数据更新

由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。 因此, Hive
  • 1

由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。

因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。

而数据库中的数据通常是需要经常进行修改的,因此可以使用INSERT INTO … VALUES添加数据,使用 UPDATE … SET 修改数据。

1.6索引

Hive在加载数据的过程不会对数据进行任何处理,因此也没有对数据中的某些Key建立索引。

因此Hive要访问数据中满足条件的特定值,就需要暴力扫描整个数据,访问延迟较高。

但由于MapReduce的引入,Hive可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive依然能够体现出优势。

2 启动Hive服务

1.使用元数据访问hive服务

$bin/hive --service metastore
  • 1

此时开启的是前台服务

通过 JDBC(MySQL驱动) 连接 MySQL

$bin/hive
  • 1

2.使用 JDBC 访问 hive

  1. 首先开启metastore元数据服务
$bin/hive --service metastore
  • 1
  1. 再开启 hiveserver2 服务 (需要多等一下)
$bin/hive --service hiveserver2
  • 1
  1. 最后客户端beeline 通过 JDBC(hive驱动) 连接到 hiveserver2
$bin/beeline -u jdbc:hive2://hadoop102:10000 -n root			
  • 1

3 Hive数据类型

3.1 基本数据类型

Hive 数据类型Java 数据类型长度例子
TINYINTbyte1byte 有符号整数20
SMALINTshort2byte 有符号整数20
INTint4byte 有符号整数20
BIGINTlong8byte 有符号整数20
BOOLEANboolean布尔类型, true 或者 falseTRUE FALSE
FLOATfloat单精度浮点数3.14159
DOUBLEdouble双精度浮点数3.14159
STRINGstring字符系列。可以指定字符集。 可以使用单引号或者双引号。‘now is the time’ “for all good men”

其中Hive中的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过不能声明其中最多有多少字符,理论上可以存储2GB的字符数。

3.2 集合数据类型

Hive 有三种复杂数据类型 ARRAY、 MAP 和 STRUCT。 ARRAY 和 MAP 与 Java 中的 Array 和 Map 类似,而 STRUCT 与 C 语言中的 Struct 类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

案例实操:

1) 假设某表有如下一行,我们用 JSON 格式来表示其数据结构。在 Hive 下访问的格式为

{
	"name": "songsong",
	"friends": ["bingbing" , "lili"] , //列表 Array,
	"children": {                      //键值 Map,
		"xiao song": 18 ,
		"xiaoxiao song": 19
	},
	"address":{                       //结构 Struct,
		"street": "hui long guan" ,
		"city": "beijing"
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2) 基于上述数据结构,我们在 Hive 里创建对应的表,并导入数据。
创建本地测试文件 test.txt

songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao
yang_beijing
  • 1
  • 2
  • 3

注意其中的分隔符 Map,Struct**,Array 中元素之间都是用 _ 分开**。

3) Hive 上创建测试表 test

create table test02{
	name string,
	friends array<string>,
	children map<string, int>,
	address struct<street:string, city:string>
}
//列分隔符
row format delimited fields terminated by ','

//Map,struct,array的元素之间分隔符
collection items terminated by '_'

//map中kv的分隔符
map keys terminated by ':'

//行分隔符
lines terminated by '\n';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

4)导入文本数据集到测试表

hive(default)> load data local inpath "/opt/module/datas/test.txt";
  • 1

插入数据也可以通过 test.txt 上传至 HDFS 上所插入表的路径

hive(default)> hadoop fs -put test.txt /user/hive/warehouse/test02
  • 1

6)最后使用 hive 查询 test02 表中的数据

>select * from test02;
  • 1

在这里插入图片描述

集合数据访问方式

数组:使用数组下标访问

在这里插入图片描述

Map:使用[]访问

在这里插入图片描述

Struct:使用 address.street 访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fTqJ7faA-1638446907137)(C:\Users\Juniors Lee\Pictures\Hive\微信截图_20211112175012.png)]在这里插入图片描述

String类型(例如"23.4")可以隐式转换为Double

4 DDL数据定义

4.1 创建数据库

1)创建一个数据库, 数据库在 HDFS 上的默认存储路径是/user/hive/warehouse/*.db

hive (default)> create database db_hive;
  • 1

2)增加 if not exists 判断,以防差错。(标准写法)

hive (default)> create database if not exists db_hive;
  • 1

3)创建一个数据库可以指定该数据库在HDFS上的存放路径。

hive(default)> create database db_hive2 location '/db_hive.db'
  • 1

在这里插入图片描述
在这里插入图片描述

4.2 查询数据库

4.2.1 显示数据库
show databases;
  • 1

在这里插入图片描述

4.2.2 查看数据库详情
desc database hive;
  • 1

在这里插入图片描述

4.2.3 切换当前数据库
use hive;
  • 1

在这里插入图片描述

4.3 创建表

4.3.1 建表语法
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]

//创建分区表
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

//创建分桶表
[CLUSTERED BY (col_name, col_name, ...)
 
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

//行数据的格式
[ROW FORMAT row_format DELIMITED FIELDS TERMINATED BY '\t']

//指定存储文件类型:
//如果是数据是纯文本:TEXTFILE,如果是数据需要压缩则使用:SEQUENCEFILE
[STORED AS file_format]

//指定表在HDFS上的存储位置
[LOCATION hdfs_path]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

4.4 表类型

4.4.1 管理表

默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表, Hive 会(或多或少地) 控制着数据的生命周期。

Hive 默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。

当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。

查看表类型

desc formatted moive;
  • 1
4.4.2 外部表

因为表是外部表,所以 Hive 并非认为其完全拥有这份数据。

删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。

管理表和外部表的使用场景:

管理表和外部表的使用场景每天将收集到的网站日志定期流入 HDFS 文本文件。

在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、 结果表使用内部表存储,数据通过SELECT+INSERT 进入内部表。

创建外部表

create external table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
管理表与外部表的互相转换

转外部表

alter table student set tblproperties('EXTERNAL'='TRUE');
  • 1

转内部表

alter table student set tblproperties('EXTERNAL'='FALSE');
  • 1

4.5 分区表

分区表对应的就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务(比如按照时间)分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样查询效率会提高很多。(谓词下推)

4.5.1 创建分区表
hive> create table dept_partition(deptno int, dname string, loc string) 
partitioned by (month string) 
row format delimited fields terminated by '\t';
  • 1
  • 2
  • 3
4.5.2 向分区表中加载数据
hive> load data local inpath '/opt/module/hive/data/dept.txt' into table dept_partition partition(month='2021-11');
  • 1

在这里插入图片描述
在这里插入图片描述

MySQL存放着分区的元数据,HDFS存放着真正的数据。

请添加图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.5.3 增加分区
hive (default)> alter table dept_partition add partition(month="20211201") partition(month="20211202")
  • 1
4.5.3 删除分区
hive (default)> alter table dept_partition drop partition(month="20211201");
  • 1
4.5.4 创建二级表
create table dept_partition2(deptno int, dname string, loc string)
partitioned by (month string, day string)
row format delimited fields terminated by '\t';
  • 1
  • 2
  • 3
4.5.5 分区表和数据产生关联三种方式
方式一:上传数据后修复
//创建目录
hive> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=202112/day=01;

//上传数据
hive> dfs -put /opt/module/datas/dept.txt /user/hive/warehouse/dept_partition2/month=202112/day=01;

//此时select不到数据,则需要执行修复命令
hive> msck repair table dept_partition2;

//再次查询数据
hive> select * from dept_partition2 where month='202112' and day="12";
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
方式二:上传数据添加分区
//创建目录
hive> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=202112/day=01;

//上传数据
hive> dfs -put /opt/module/datas/dept.txt /user/hive/warehouse/dept_partition2/month=202112/day=01;

hive> alter table dept_partition add partition(month="20211201") partition(month="20211202")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
方式三:创建文件夹后load数据到分区
//创建目录
hive> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=202112/day=01;

//上传数据
hive> load data local inpath 'opt/module/datas/dept.txt' into table dept_partition2 partition(monnth="202112",day="10");

//查询数据
hive (default)> select * from dept_partition2 where
month='201709' and day='10';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/396246
推荐阅读
相关标签
  

闽ICP备14008679号