HIVE 核心原理.docx
- 文档编号:23532945
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:67
- 大小:41.90KB
HIVE 核心原理.docx
《HIVE 核心原理.docx》由会员分享,可在线阅读,更多相关《HIVE 核心原理.docx(67页珍藏版)》请在冰豆网上搜索。
HIVE核心原理
一、Hive概述
1.1Hive是什么
∙由Facebook开源用于解决海量结构化日志的数据统计
∙基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并且提供类SQL的查询功能
∙Hive仅仅是一个工具,本身不存储数据只提供一种管理方式,同时也不涉及分布式概念,就是个软件而已
∙Hive本质就是MapReduce,将类SQL(HQL)转换成MapReduce程序
1.1.1HQL转换MR流程
解释:
1.Hive处理的数据存储在HDFS
2.Hive分析数据底层默认实现是MapReduce[可以修改为spark]
Hive-on-MRisdeprecatedinHive2andmaynotbeavailableinthefutureversions.Considerusingadifferentexecutionengine(i.e.spark,tez)orusingHive1.Xreleases.
∙1
1.执行的程序运行在yarn上
2.Hive相当于Hadoop的一个客户端
3.Hive不是分布式
1.2Hive优缺点
1.2.1优点
1.操作接口采用类SQL语法,提供快速开发的能力(简单、易上手)
2.避免去写MR,减少开发人员学习成本
3.Hive的延迟比较高(因为MR延迟高),因此Hive常用于数据分析
4.Hive优势在于处理大数据(数据量少真不如MySQL等)
5.Hive支持用户自定义函数,可以根据自己的去求实现自己的函数
1.2.2缺点
1.Hive的HQL表达能力有限(MR决定的)
1.迭代算法无法表达
2.不适用于数据挖掘
2.Hive的效率比较低
1.Hive自动生成的MR作业,通常情况不够智能
2.Hive调优难(只能对资源,SQL层面调优,无法深入作业底层逻辑)
1.3Hive架构原理
1.
用户接口:
Client
2.
CLI(hiveshell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)
3.
4.
元数据:
Metastore
5.
包括表名、表所属的数据库、表的拥有者、列/分区字段、表的类型、表数据所在的目录等(自带个derby数据库,推荐配置到MySQL)
6.
7.
底层存储:
HDFS
8.
使用HDFS进行存储,使用MapReduce计算
9.
10.
驱动器:
Driver
11.
1.解析器(SQLParser):
将SQL字符串转换成抽象语法树AST,并对语法树进行语法分析,如:
SQL语法、表/字符是否存在
2.编译期(PhysicalPlan):
将AST编译生成逻辑执行计划
3.优化器(QueryOptimizer):
对逻辑执行计划进行优化
4.执行器(Execution):
把逻辑执行计算转换成运行的物理计划,即MR/Spark
Hive通过给用户提供的一系列交互接口,接受到用户编写的SQL,使用自己的Driver结合MetaStore,将SQL指令翻译成MapReduce提交到Hadoop中执行,将执行结果输出到用户交互接口。
1.4Hive和传统数据库比较
Hive除了提供类似SQL语法外和传统数据库没有任何相似之处,Hive是站在数据仓库出发点而设计的。
1.4.1数据存储位置
Hive是建立在Hadoop之上,所有的Hive数据都是存储在HDFS上;传统数据库将数据保存在本地文件系统中;因此Hive能够处理更大更多的数据
1.4.2数据更新
Hive是针对数据仓库应用设计,因此数据一次写入多次读出,即Hive中不建议对数据进行改写操作,所有数据都是在加载的时候确定好;对于数据库通常需要进行频繁的增删查改
1.4.3索引
Hive在加载数据过程不会对数据进行任何处理,因为数据量庞大建立索引并不划算,因此Hive访问数据中满足特定值需要暴力扫描真个数据,因此访问延迟高。
由于MapReduce的引入,Hive可以并行访问数据,即便没有索引也可用于大数据量的访问;传统数据库通常针对一个或多个列建立索引,因此在访问数据是延迟低效率高,即Hive不适合实时数据分析
1.4.4执行
Hive的执行引擎为MR/Spark,传统数据库都有自己的执行引擎
1.4.5可拓展性
由于Hadoop的高拓展性,因此Hive也具备很强的拓展性;传统数据库的拓展会受到一定的限制
1.4.6数据规模
Hive可以利用MapReduce进行大规模数据的并行计算;传统数据库支持的数据规模较小
二、Hive初步
2.1Hive安装
将元数据配置到MySQL中需要初始化,初始化命令(其余步骤可自行XX):
schematool-dbTypemysql-initSchema
∙1
2.2Hive基本操作
1.
启动hive
2.
[root@masterhive-3.2.1]#hive
3.
4.
5.
∙1
6.
查看数据库
7.
hive(hive)>showdatabases;
OK
database_name
default
hive
Timetaken:
0.02seconds,Fetched:
2row(s)
8.
9.
10.
∙1
∙2
∙3
∙4
∙5
∙6
hive自带一个default数据库,默认也是进这个数据库
11.
切换数据库
12.
hive(hive)>usehive;
OK
Timetaken:
0.031seconds
13.
14.
15.
∙1
∙2
∙3
16.
创建表
17.
hive(hive)>createtableifnotexiststbl_1(idint,namestring);
OK
Timetaken:
0.628seconds
18.
19.
20.
∙1
∙2
∙3
和MySQL语法基本一致,只是Hive的数据类型和Java类似
21.
查看表结构
22.
hive(hive)>desctbl_1;
OK
col_namedata_typecomment
idint
namestring
Timetaken:
0.084seconds,Fetched:
2row(s)
--------------------分隔符-------------------
#查看表的详细信息
hive(hive)>descformattedtbl_1;
OK
col_namedata_typecomment
#col_namedata_typecomment
idint
namestring
#DetailedTableInformation
Database:
hive
OwnerType:
USER
Owner:
root
CreateTime:
WedAug2619:
55:
58CST2020
LastAccessTime:
UNKNOWN
Retention:
0
Location:
hdfs:
//master:
9000/user/hive/warehouse/hive.db/tbl_1
TableType:
MANAGED_TABLE
TableParameters:
COLUMN_STATS_ACCURATE{\"BASIC_STATS\":
\"true\",\"COLUMN_STATS\":
{\"id\":
\"true\",\"name\":
\"true\"}}
bucketing_version2
numFiles0
numRows0
rawDataSize0
totalSize0
transient_lastDdlTime1598442958
#StorageInformation
SerDeLibrary:
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat:
org.apache.hadoop.mapred.TextInputFormat
OutputFormat:
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed:
No
NumBuckets:
-1
BucketColumns:
[]
SortColumns:
[]
StorageDescParams:
serialization.format1
Timetaken:
0.154seconds,Fetched:
32row(s)
23.
24.
25.
∙1
∙2
∙3
∙4
∙5
∙6
∙7
∙8
∙9
∙10
∙11
∙12
∙13
∙14
∙15
∙16
∙17
∙18
∙19
∙20
∙21
∙22
∙23
∙24
∙25
∙26
∙27
∙28
∙29
∙30
∙31
∙32
∙33
∙34
∙35
∙36
∙37
∙38
∙39
∙40
∙41
∙42
∙43
∙44
26.
插入数据(不要用,不要用,不要用)
27.
hive(hive)>insertintotbl_1values(1,'zhangsan');
...
...
...
Timetaken:
84.754seconds
28.
29.
30.
∙1
∙2
∙3
∙4
∙5
谁用谁知道
31.
查询数据
32.
hive(hive)>select*fromtbl_1;
OK
tbl_1.idtbl_1.name
1zhangsan
Timetaken:
0.214seconds,Fetched:
1row(s)
33.
34.
35.
∙1
∙2
∙3
∙4
∙5
36.
退出hive
37.
hive(hive)>quit;
38.
39.
40.
∙1
41.
执行hdfsshell
42.
hive(hive)>dfs-ls/;
Found3items
drwxr-xr-x-rootsupergroup02020-07-2115:
57/HBase
drwx-wx-wx-rootsupergroup02020-07-2118:
27/tmp
drwxrwxrwx-rootsupergroup02020-07-2118:
00/user
43.
44.
45.
∙1
∙2
∙3
∙4
∙5
46.
执行linuxshell
47.
hive(hive)>!
pwd;
/usr/local/soft/hive-3.2.1
48.
49.
50.
∙1
∙2
2.3Hive常规操作
hive(hive)>insertintotbl_1values(1,'zhangsan');
...
...
...
Timetaken:
84.754seconds
∙1
∙2
∙3
∙4
∙5
插入一条数据84秒,显然不现实…为此Hive插入数据将采用最暴力最直接的方式,只需要将数据文件放到hdfs制定的路径即可。
但也不是什么数据都可以,需要在创建表时指定分隔符。
hive(hive)>createtableifnotexiststbl_2(idint,namestring)
>rowformatdelimitedfieldsterminatedby'\t';
OK
Timetaken:
0.118seconds
∙1
∙2
∙3
∙4
准备数据
[root@masterdata]#catstudent.txt
1zhangsan
2lisi
3wangwu
4zhaoliu
5tianqi
[root@masterdata]#pwd
/usr/local/soft/hive-3.2.1/data
∙1
∙2
∙3
∙4
∙5
∙6
∙7
∙8
2.3.1hive插入数据一
加载本地数据到hive
hive(hive)>loaddatalocalinpath'/usr/local/soft/hive-3.2.1/data/student.txt'intotabletbl_2;
Loadingdatatotablehive.tbl_2
OK
Timetaken:
0.311seconds
hive(hive)>select*fromtbl_2;
OK
tbl_2.idtbl_2.name
1zhangsan
2lisi
3wangwu
4zhaoliu
5tianqi
Timetaken:
0.192seconds,Fetched:
5row(s)
∙1
∙2
∙3
∙4
∙5
∙6
∙7
∙8
∙9
∙10
∙11
∙12
∙13
∙14
评价:
方便、推荐使用
2.3.2hive插入数据二
hive管理的数据是放在hdfs,可以再配置文件指定存储路径,可以进入指定路径查看,也可以通过descformatted表名看到该表的存储路径
∙hive在hdfs存储的根路径是在/…/warehouse/下
∙一个数据库对应一个文件夹,命名方式为数据库名.db(默认数据库除外)
∙每张表也对应一个文件夹,命名方式为表名
∙数据文件直接放在表对应的文件夹下,因此通过load方式其实底层调用的是hadoopfs-put
∙默认数据库下的表直接放在warehouse下命名方式不变
基于上述规律可以有第二种插入方式,直接通过hadoop的shell将文件put到指定的hdfs路径下即可
[root@masterdata]#hadoopfs-putstudent.txt/user/hive/warehouse/hive.db/tbl_2/student_1.txt
∙1
hive(hive)>select*fromtbl_2;
OK
tbl_2.idtbl_2.name
1zhangsan
2lisi
3wangwu
4zhaoliu
5tianqi
1zhangsan
2lisi
3wangwu
4zhaoliu
5tianqi
Timetaken:
0.396seconds,Fetched:
10row(s)
∙1
∙2
∙3
∙4
∙5
∙6
∙7
∙8
∙9
∙10
∙11
∙12
∙13
∙14
总结:
也可以用,但是必须知道表在hdfs上的路径,所以这种方式路就走窄了呀!
看过hive数据库、表、数据在hdfs上的存储结构后,尝试再次加载一次数据,这次通过load加载hdfs上的数据
hive(hive)>loaddatainpath'/student.txt'intotabletbl_2;
Loadingdatatotablehive.tbl_2
OK
Timetaken:
0.683seconds
∙1
∙2
∙3
∙4
load方式加载hdfs文件不需要加local(很显然),这时候再次查看hdfs信息,此时原数据将会被删除(其实就是hadoopfs-mv)
对于多次加载相同数据文件情况,hive会将数据文件重命名后上传到hdfs指定路径,重命名格式:
原文件名_copy_n.txt;和windows下同名文件处理类似。
2.4Hive数据类型
2.4.1基本数据类型
Hive数据类型
Java数据类型
长度
tinyint
byte
1byte
smalint
short
2byte
int
int
4byte
bigint
long
8byte
boolean
boolean
true/false
float
float
单精度
double
double
双精度
string
String
字符串
timestamp
bigary
常用的基本数据类型有int、bigint、double、string且不区分大小写;boolean一般使用0/1代替以减少存储量;string使用最多,一般都是处理日志,理论上可以存储2G数据(一行)。
2.4.2集合数据类型
数据类型
描述
语法实例
struct
结构体,复杂无关系数据
struct v,k2: v> map 字典,键值对元组集合 map array 数组,同一类型集合 array struct和map区别在于map只能存储一组一组的k-v对,且一个map中的k不能相同,struct可以存储很对组相同key不同value的数据结构,即map中每组数据的key都不相同,struct中每组数据对应位置的key都是一样的;集合数据类型允许任意层次的嵌套。 2.4.3类型转换 Hive支持类似java的数据类型转换 隐式转换 ∙tinyint->smalint->int->bigint->float->double ∙string类型只有是数字才可以转换 ∙boolean不能转换成任意类型 强制类型转换 hive(hive)>selectcast('1'asint); OK _c0 1 Timetaken: 0.937seconds,Fetched: 1row(s) hive(hive)>selectcast('a'asint); OK _c0 NULL Timetaken: 0.184seconds,Fetched: 1row(s) ∙1 ∙2 ∙3 ∙4 ∙5 ∙6 ∙7 ∙8 ∙9 ∙10 好吧,看不出什么效果 2.4.4测试集合数据类型 需要存储如下格式数据(json) { "name": "陈小春", "friends": ["郑伊健","谢天华"],//列表Array "children": {//键值Map "jasper": 3, "baby": 1, } "address": {//结构Struct "street": "皇后大道", "city": "香港" } } { "name": "刘烨", "friends": ["章子怡","孙俪"], "children": { "诺一": 8, "霓娜": 6, } "address": { "street": "长安街", "city": "北京" } } ∙1 ∙2 ∙3 ∙4 ∙5 ∙6 ∙7 ∙8 ∙9 ∙10 ∙11 ∙12 ∙13 ∙14 ∙15 ∙16 ∙17 ∙18 ∙19 ∙20 ∙21 ∙22 ∙23 ∙24 将一条数据转换成一行数据,去除没必要的数据,在一条数据中,字段之间用’,‘隔开,集合元素之间用’_‘隔开,map的kv用’: '隔开,因此可以转换成如下格式 陈小春,郑伊健_谢天华,jasper: 3_baby: 1,皇后大道_香港 刘烨,章子怡_孙俪,诺一: 8_霓娜: 6,长安街_北京 ∙1 ∙2 针对上述数据创建如下表 hive(hive)>createtabletbl_3(namestring,friendsarray string,city: string>) >rowformatdelimitedfieldsterminatedby',' >collectionitemsterminatedby'_' >mapkeysterminatedby': '; OK Timetaken: 0.124seconds ∙1 ∙2 ∙3 ∙4 ∙5 ∙6 解释: ∙rowformatdelimitedfieldsterminatedby','设置字段分割符 ∙collectionitemsterminatedby'_'设置集合元素分割符 ∙mapkeysterminatedby': '设置map键值对分隔符 ∙linesterminatedby'\n'设置行分隔符,默认\n 导入数据测试 hive(hive)>loaddatalocalinpath'/usr/local/soft/hive-3.2.1/data/test_collection'intotabletbl_3; Loadingdatatotablehive.tbl_3 OK Timetaken: 0.281seconds hive(hive)>select*fromtbl_3; OK tbl_3.nametbl_3.friendstbl_3.childresstbl_3.address 陈小春["郑伊健","谢天华"]{"jasper": 3,"baby": 1}{"street": "皇后大道","city": "香港"} 刘烨["章子怡","孙俪"]{"诺一": 8,"霓娜": 6}{"street": "长安街","city": "北京"} Timetaken: 0.176seconds,Fetched: 2row(s) hive(hive)>selectname,friends[0],childress['baby'],address.streetfromtbl_3; OK name_c1_c2street 陈小春郑伊健1皇后大道 刘烨章子怡NULL长安街 Timetaken: 0.222seconds,Fetched: 2row(s) ∙1 ∙2 ∙3 ∙4 ∙5 ∙6 ∙7 ∙8 ∙9 ∙10 ∙11 ∙12 ∙13 ∙14 ∙15 ∙16 三、DDL数据定义语言 3.1数据库操作 3.1.1创建数据库 1.方式一 创建一个数据库,默认存储在hdfs中/user/hive/warehouse/*.db hive(default)>createdatabasetest; OK Timetaken: 0.827seconds ∙1 ∙2 ∙3 若数据库已经存在会报ExecutionError,推荐使用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- HIVE 核心原理 核心 原理