Hive 总结
总结人:XXX 2020.04.29
0.补充
0.1 什么是hive
1. Hive:由Facebook开源用于解决'海量结构化日志'的数据统计'工具'。
2. Hive是基于Hadoop的一个'数据仓库工具',可以将结构化的数据文件'映射'为一张表,并提供类SQL查询功能。
3. '本质':将HQL转化成MapReduce程序
4. '原理介绍'
(1)Hive处理的数据存储在HDFS
(2)Hive分析数据底层的实现是MapReduce
(3)执行程序运行在Yarn上
0.2 优缺点
-- 1. 优点:
1. 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
2. 避免了去写MapReduce,减少开发人员的学习成本。
3. Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
4. Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
5. Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
-- 2. 缺点
1. Hive的HQL表达能力有限
2. 迭代式算法无法表达
3. 数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现。
4. Hive的效率比较低
(1)Hive自动生成的MapReduce作业,通常情况下不够智能化
(2)Hive调优比较困难,粒度较粗
0.3 Hive架构原理
-- 1. 用户接口:Client
CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)
-- 2. 元数据:Metastore
元数据包括:
a、表名
b、表所属的数据库(默认是default)
c、表的拥有者
d、列/分区字段
e、表的类型(是否是外部表)、
f、表的数据所在目录等;
'默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore'
-- 3. Hadoop
使用HDFS进行存储,使用MapReduce进行计算。
-- 4. 驱动器:Driver
1. '解析器'(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,
比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
2. '编译器'(Physical Plan):将AST编译生成逻辑执行计划。
3. '优化器'(Query Optimizer):对逻辑执行计划进行优化。
4. '执行器'(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。
0.4 hive与数据库的比较
由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处
-- 1. 查询语言
hive有类似sql的hql查询语言
-- 2. 数据更新
1. hive针对数据仓库而设计,适合读多写少的场景
2. mysql的数据需要经常进行修改。
-- 3. 执行延迟
1. hive没有索引 + 基于mr计算,延迟性高;
2. 这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势
-- 4. 数据规模
1. 支持大数据规模的数据
0.5 tez引擎
1. 'mr引擎':每个任务及任务之间都需要落盘
2. 'Tez引擎':可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能。
一、HiveJDBC客户端基本操作
1.1 HvieJDBC的登入与退出
-- 方式一:使用beeline方式
访问方式:beeline -u jdbc:hive2://hadoop102:10000 -n lianzp
退出方式:!quit 、!exit 、 ctrl + c
前提:mysql服务和hiveservice2服务一定要启动
-- 方式二: 使用hive的方式
访问方式:hive
退出方式:quit; exit;
1.2 Hive常用的交互命令
“-e” 不进入hive的交互窗口执行sql语句**
“-f” 执行脚本中sql语句**
1.3 Hive数据类型
- 基本数据类型
Hive数据类型 | Java数据类型 | 长度 | 例子 |
---|---|---|---|
TINYINT | byte | 1byte有符号整数 | 20 |
SMALINT | short | 2byte有符号整数 | 20 |
INT | int | 4byte有符号整数 | 20 |
BIGINT | long | 8byte有符号整数 | 20 |
BOOLEAN | boolean | 布尔类型,true或者false | TRUE FALSE |
FLOAT | float | 单精度浮点数 | 3.14159 |
DOUBLE | double | 双精度浮点数 | 3.14159 |
STRING | string | 字符系列。可以指定字符集。可以使用单引号或者双引号。 | ‘now is the time’ “for all good men” |
TIMESTAMP | 时间类型 | ||
BINARY | 字节数组 |
重点关注:int,string,double,bigint ;
使用注意事项:在sql中需要指定字段的长度,而在hive中不需要,可以理解为可变参数 ;
数据类型的字节数:
byte short int long float double char 1 2 4 8 4 8 2 其中float的取值范围比long还要大。
-
集合数据类型
数据类型 描述 语法示例 STRUCT 和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。 struct()例如struct<street:string, city:string> MAP MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 map()例如map<string, int> ARRAY 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。 Array()例如array
创建表的实例:
create table if not exists test(
name string,
friends array<string>, /*--数组的格式--*/
children map<string, int>, /*--集合的格式--*/
address struct<street:string, city:string>/* --Struct格式-- */
)
row format delimited fields terminated by ','
/* 行 格式 划分属性 以‘,’分割 ,统称为列分割符*/
collection items terminated by '_'
/*集合(数组,集合,Struct) 多个元素之间以‘_’ 分割,则要求所有的数据的格式均是一样的*/
map keys terminated by ':'
/*指明集合中key和value以‘:’ 进行分割*/
lines terminated by '\n';
/*行数据,以换行符进行分割*/
获取集合中属性的方式:
* 数组:使用索引的方式:字段名[index]
*
* 集合:使用key的值获取:字段名[key的值]
*
* Struct:使用:字段.属性值
1.4 类型转化
-
隐式类型转换规则
-
任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT;
-
所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE;
-
TINYINT、SMALLINT、INT都可以转换为FLOAT;
-
BOOLEAN类型不可以转换为任何其它的类型。
-
-
CAST操作显示进行数据类型转换
-- 示例: select cast ('1' as int) + 3 ; /* 4 */ select '1' + 3 ; /* 4.0 */
二、DDL数据定义
2.1 数据库操作
2.1.1显示和查询数据库与表信息
1.显示数据库
show databases;
2.切换数据库
use 数据库名;
3.查询数据库详细信息
desc database [extended] 数据库名
4.查询表的详细信息
desc [formatted] 表名
2.1.2 创建数据库
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
实例:
1.create database db_hive;
2.create database if not exists db_hive;
/* 加上 if not exists 后,当该数据库已存在时,不抛异常,也不做创建数据库的操作*/
3.create database db_hive2 location '/db_hive2.db';
/*指定数据创建时,在hdfs上的路径,如果没有此操作,则默认的路径为:/user/hive/warehouse/数据库名*/
2.1.3 删除数据库
1.删除空的数据库(何为空的数据库?指该数据中没有表)
drop database db_hive2 ;
2.当数据库不存在时,避免抛异常
drop database if not exists db_hive2 ;
3.当数据库不为空时,加上cascade进行删除
drop database if not exists db_hive2 cascade ;
2.2 表的操作
2.2.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]
[STORED AS file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement]
各个参数说明:
-
EXTERNAL :表示外部表,在删除表时,只会删除mysql中的元数据,在hdfs的真实数据不会被删除,如果没EXTERNAL ,则删除表的时候,元数据和真实数据均为被删除。
-
IF NOT EXISTS :当表存在时,添加此操作,则不会抛异常,同时也不会执行建表操作。
-
COMMENT :字段或表的注释;
-
PARTITIONED BY : 分区**
(后面详细讲)
**; -
CLUSTERED BY : 分桶**(后面详细讲)**;
-
SORTED BY :文件在hdfs的存储格式 ,存储的方式有:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE;
-
ROW FORMAT row_format :列分割符;
-
LOCATION hdfs_path:指定表在HDFS上的存储位置;默认为当前库下。
-
AS select_statement :建表时进行加载数据,通过as后面的查询语句。
2.2.2 管理表与外部表
区别:
1.管理表:也称内部表,当删除管理表时,hdfs中的数据和mysql中的元数据均会被删除 -- 控制表的生命周期
2.外部表:当删除管理表时,hdfs中的数据不会被删除,mysql中的元数据会被删除 -- 不能控制表的生命周期
在实战过程中,我们一般都是使用外部表。
内外部表的定义、查看和转换
1.定义:
创建表单时,加上 external 关键字则表示为外部表。
2.查看:
通过 desc formatted 表名 。
3.转换:
alter table 表名 set tblproperties('EXTERNAL'='TRUE');
注意事项:
a、TRUE : 转换为外部表;
b、FALSE : 转换为内部表;
c、('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE