赞
踩
Hive是一个基于Hadoop的数仓开发工具。Hive将结构化的数据映射为一张表,提供类SQL语言,对数据进行分析检索功能。
所以,Hive不是一门SQL语言,而是一个Hadoop上进行数据分析的客户端,类SQL的分析工具。Hive将SQL转换成MR程序,并放到Yarn、Spark等分析引擎上并行执行。
常用的计算引擎有:MapReduce、tez、Spark等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ElTPyb7W-1664638646998)(E:\笔记\hadoop\图片\image-20221001110613017.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2FlMtSXR-1664638646998)(E:\笔记\hadoop\图片\image-20221001110942902.png)]
优点:
缺点:
Hive提供了两种连接到Driver的方式:CLI直连、hiveserver2代理访问。
hiveserver2服务提供远程代理访问功能,但是由于Hadoop集群的数据具备访问控制权限,那么通过hiveserver2访问数据,是一那种身份进行访问呢?
hiveserver2访问数据库的具体身份是由
hive.server2.enable.doAs
参数决定的,该参数代表是否启用用户模拟功能。如果该参数设置为false,那么就是启动hiveserver2服务的用户的身份。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KShRYphc-1664638646999)(E:\笔记\hadoop\图片\image-20221001112723288.png)]
如果设置为true,hiveserver2会模拟成登陆客户端的用户,用模拟用户的身份访问数据。
默认情况下,该参数设置为true。因为
开启模拟用户功能后,可以保证各个用户之间的权限隔离。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wdcuz6Tc-1664638646999)(E:\笔记\hadoop\图片\image-20221001112733856.png)]
基本数据类型:
Hive | MySQL | Java | 长度 | 例子 |
---|---|---|---|---|
tinyint | tinyint | byte | 1byte有符号整数 | 2 |
smallint | smallint | short | 2byte有符号整数 | 20 |
int | int | int | 4byte有符号整数 | 2000 |
bigint | bigint | long | 8byte有符号整数 | 20000000 |
boolean | 无 | boolean | 布尔类型,true或者false | true false |
float | float | float | 单精度浮点数 | 3.14159 |
double | double | double | 双精度浮点数 | 3.14159 |
string | varchar | string | 字符系列。可以指定字符集。可以使用单引号或者双引号。 | ‘now is the time’ “for all good men” |
timestamp | timestamp | 时间类型 | ||
binary | binary | 字节数组 |
集合数据类型:
数据类型 | 描述 | 语法示例 |
---|---|---|
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 |
Hive中由上述三种复杂数据类型。其中Map和Array类似于Java中的集合;struct是一种特殊的类型,一个struct结构体中可以包含多个成员,每个成员都可以是不同的数据类型。
类型转换机制:
Hive中的原子数据类型可以进行隐式转换,例如Java中的自动类型提升。例如tinyint会自动转换成int,只能向上转型,不能够自动向下转型。除非使用==cast( xxx as 数据类型)==进行类型转换。
Hive中所有的整数类型、float类型、string类型都可以隐式转换为double类型。
tinyint、smallint、int都可以转换为float。
但是,boolean类型不能转换成其他任何类型。
Hive的表分为管理表(内部表)、外部表。
Hive执行创建表时,默认创建的都是管理表(内部表)。管理表的数据,都会或多或少的被Hive控制生命周期,表数据默认存放在Hive配置的默认存储路径下,默认路径通过修改配置文件修改。
删除管理表时,Hive会删除表的元数据和真实数据信息。所以管理表不适合跟其他工具共享数据。
CREATE 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] -- 根据查询结果创建表
[LIKE table_name] -- 允许复制表的结构,但是不能复制表内数据
创建外部表时使用==external==声明创建的是外部表。
CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name -- 创建表名
外部表在删除表时,hive只会删除表的元数据信息,并不会删除表内的真实数据。
外部表和内部表可以相互转换。
‘EXTERNAL’=‘TRUE’,转换为外部表,FALSE为内部表,书写格式
默认大写
。
ALTER TABLE table_name RENAME TO new_table_name -- 修改表名
除了修改表名,Hive还支持修改表内信息:
表内列名可以随意修改;
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] -- 更新列的信息,使用CHANGE关键字
但是列的字段类型只能小改大,不能大改小;
ADD可以在表的最后一列增加字段;
Replace是将表的所有字段全部替换,所以使用Replace时需要将字段和数据类型全部一一对应;
使用Replace可以增加、减少字段数量。
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) -- 增加、替换关键字,替换其实包括了修改、增加、删除列的功能
DROP可以删除表的信息和表结构;
DROP TABLE table_name;
truncate只能清空表内信息,不能删除表结构。
TRUNCATE TABLE table_name;
load data [local] inpath '数据的path' -- 将数据导入的路径,local表示本地路径,不加local是HDFS路径
[overwrite] into table student [partition (partcol1=val1,…)];
-- overwrite表示覆盖原表中的数据。
insert into(overwrite) table table_name_A
select * from table_name_B -- 将B表中查询的结果插入到A表中,overwrite表示原表数据,into表示普通插入数据
使用 insert…select 往表中导入数据时,查询的字段个数必须和目标的字段个数相同,不能多,也不能少,否则会报错。但是如果字段的类型不一致的话,则会使用null值填充,不会报错。
而使用load data形式往hive表中装载数据时,则不会检查。如果字段多了则会丢弃,少了则会null值填充。同样如果字段类型不一致,也是使用null值填充。
from -> join -> where -> group by -> having -> select -> distinct -> order by -> limit -> union
Hive中一共封装了四种函数:单行函数、聚合函数、炸裂函数、窗口函数。
一行数据输入,输出一行数据 -----> 一进一出。
多行数据输入,一行数据输出 -----> 多进一出。
一行数据输入,多行数据输出,将一行数据炸裂成多行 -----> 一进多出。
hive中不支持将炸裂函数和普通的查询列一起写。
所以炸裂函数需要使用lateral view侧写体现。
侧写lateral view
select ... --(普通查询条件)
from table_name
lateral view
udtf(expression) -- 炸裂函数(表达式)
table_name_tmp -- (虚拟表名)
AS colum_name_tmp -- (虚拟表中的字段名)
lateral view每行数据都调用udtf,将一行数据炸成多行并将结果存储为一张虚拟表,表内字段名可以自定义,生成的虚拟表支持起别名。
窗口函数并不是普通的聚合函数。窗口函数是给聚合函数确定聚合的范围,并给范围内的数据添加标记,标记将作为最后一列数据输出,支持起别名。
注意:窗口函数是一行一行执行的!
select sum(xxx) over (partition by a order by b rows between ... and ...)
Hive支持用户自定义函数,具有良好的扩展性。
动态分区
Hive支持动态分区,插入数据时数据库会自动按照分区字段的值将数据插入对应分区,使用动态分区需要关闭严格模式。
Hive的分区表与Kafka中的分区概念不同。
- Hive的分区是将数据按照一定的规则存储到同一个分区(HDFS中的文件夹)。
- Kafka的分区则是将topic下的数据分为多个分区,供消费者组内的不同消费者消费,提高数据的吞吐量和消费并行度。
Hive常用的存储格式搭配:
ORC + snappy
。
explain计划由若干个stage组成,stage之间相互依赖。每个stage又包括map operator tree和reduce operator tree。一个operator代表map或reduce在单一一个阶段的逻辑操作。
未经优化的分组聚合,是通过一个MR程序实现,按照正常的MR程序流程完成数据分析。分组聚合是在Map端维护一个map-side聚合,使用Hash Table将数据加载到缓存,减少Shuffle落盘的数据量,完成聚合后将结果按照分区字段发送到reduce端。
map-side能有效地减少shuffle的数据量,提高分组聚合的效率。
大量相同的key值涌入同一个reduce端,各个reduce task的数据分配量差异十分巨大,由此造成了数据倾斜。
Hive会自动调整join顺序,将数据量小的表提前进行join,再用结果去join其他的表从而减少数据传输量。
尽量将过滤操作前移,减少后续操作的数据量。cbo也会完成一部分谓词下推操作。
Hive会自动调整join顺序,将数据量小的表提前进行join,再用结果去join其他的表从而减少数据传输量。
尽量将过滤操作前移,减少后续操作的数据量。cbo也会完成一部分谓词下推操作。
Hive中的某些查询情况,可以不进行MR计算,直接从表中查询数据。例如select * from 表操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。