《Hive编程指南》读书笔记

2019-06-12  本文已影响0人  kaiker

第一章 基础知识

1.1 MapReduce和Hadoop基础

Hive不支持记录级别的更新、插入或者删除、Hive不支持事务,Hive中的锁意义也不大。
MapReduce-Map将输入的key-value转换为0至多个key-value-Reduce会将同个key的所有key-value进行处理,转换为一个key-value

1.2 Hadoop生态中的Hive

Hive通过一个表示“job执行计划”的XML文件驱动执行内置的、原生的Mapper和Reducer模块。
如果用户需要使用Hive无法提供的数据库特性,可以尝试使用HBase。
Pig 声明关系间联系,流式,常用于ETL。

第二章 基础操作

2.7 命令行界面

通过set hivevar:变量名 设置自定义变量。在Aeolus可通过{{变量名}}设置自定义变量

第三章 数据类型和文件格式

3.1 基本数据类型

用户将float与double进行对比时,hive会隐式地将类型转换为两个类型中值较大的一类。

3.2 集合数据类型

Hive中包括struct、map和array集合数据类型。
struct类似C里的struct,调用时使用字段名.xxx调用
map是key-value形式,调用时使用字段名['xxx']调用
array是数组形式,调用时用字段名[1]调用

3.3 文本文件数据编码

hive中默认的记录和字段分割符:\n换行,^A用于分割列,^B用于分割array或者struct,^C用于分割键和值

3.4 读时模式

传统数据库是写时模式,在写入时进行数据检查
Hive是读时模式,在查询时进行数据验证

第四章 HiveQL:数据定义

4.1 Hive中的数据库

hive中可以重复使用use,因为hive没有嵌套数据库概念

在drop后添加cascade可先自行删表

4.3 创建表

hive会自动增加两个属性:last_modified_by和last_modified_time
hive可创建外部表,外部表可以是存储在其他位置的文件

4.4 分区表

分区表在底层的实现上是将每个分区设置为独立的文件,以分区命名。
在Aeolus查询需要指定分区,提高查询效率。

第五章 HiveQL:数据操作

5.1 向管理表中装载数据

Hive没有行级别的数据插入、数据更新和删除操作,所以更新是批量处理的。
insert overwrite table xxx partition(xxx)
指定了overwrite之后目标文件中之前存在的数据将会被先删除掉
hive可动态插入分区,根据select最后n个字段(对应n个分区)进行插入

第六章 HiveQL:查询

6.1 select语句

explode(xxx)可用于打散array,map。配合lateral view使用,可以让打散后的值变为多行
本地模式下hive可避免mapreduce,进行全表扫描、仅限制分区的查询时会是本地模式

6.2 where语句

Rlike实现正则匹配
浮点数比较,显示指出浮点数类型

6.4 JOIN语句

hive只支持等值连接,因为其他类型可能较难在MapReduce中实现
hive假定查询中最后一个表是最大的那个表,从左到右表的大小依次增加
left semi join用来替代 in接子查询
笛卡尔积不是并行执行的,在Mapreduce中无法进行优化
map-side join解决数据倾斜

6.5 order by/sort by/distribute by/cluster by

sort by只会在每个reducer里面进行排序
结合distribute by使用,可以使相同的key在一起进行排序,在有组内排序需求时可以使用
cluster by = sort by + distribute by

6.6 类型转换

cast(字段 as 类型),在进行比较时,建议转换为同一类型后比较

6.7 抽样查询

https://blog.csdn.net/zylove2010/article/details/78290319
如果有用到,可能大多是使用的上述第三种 order 关键词
select * from table_name where col=xxx order by rand() limit num;

第七章 HiveQL:视图

视图在工作中较少用,Hive并不支持通过视图实现访问安全,因为用户必须有能够访问整个底层原始表的权限,这样视图才能工作

第八章 HiveQL:索引

bitmap索引:
https://blog.csdn.net/zhou920786312/article/details/72790171
http://blog.itpub.net/29654823/viewspace-2150299
列较多、列基数较小的情况下适用,占用空间小,and运算适用。

第九章 模式设计

分区是hive的重要特点,分区大大减少hive的数据扫描。
对于太零散的分区,可以使用分桶的方式,将数据打散进行存储。具体的实现方式样例:clustered by (字段名) into 96 buckets
列存储运用:列当中存在较多重复值、列数特别多。

https://www.cnblogs.com/ljhdo/archive/2017/12/14/5508274.html
行存储使用逐行处理模式,每次只处理一行数据;而列存储索引使用批处理模式,每次处理一批数据行。
行存储是逐行存储(Row Store),每一个Page存储多行数据,而列存储(Column Store)把数据表中的每一列单独存储在Page集合中,这意味着,Page集合中存储的是某一列的数据,而不是一行中所有列的数据。在读取数据时,行存储把一行的所有列都加载到内存,即使有些列根本不会用到;而列存储只把需要的列加载到内存中,不需要的列不会被加载到内存中。
列存储索引自动对数据进行压缩处理,由于同一行的数据具有很高的相似性,压缩率很高,数据读取更快速。

多运用压缩,因为hive对压缩非常兼容,而MapReduce任务大多是IO密集,而不是CPU密集。

第十章 调优

10.1 explain

对于explain的输出可以忽略TOK_
每个stage可以是一个MapReduce任务、抽样阶段、合并阶段、limit阶段
Mysql执行顺序:https://www.cnblogs.com/rollenholt/p/3776923.html
Hive执行顺序:https://www.cnblogs.com/gxgd/p/9431783.html select的位置不同主要与hive map reduce的过程有关。

10.2 限制调整

hive.limit.optimize.enable 限制limit的数量

10.3 本地模式

hive可通过本地模式在单台机器上处理所有任务,数据量小的时候可以使用

10.4 严格模式

限制三类情况:一、必须限制分区;二、order by必须limit;三、限制笛卡尔积查询

10.5 调整mapper和reducer数量

https://blog.csdn.net/B11050101/article/details/78754652
map的块默认大小128MB
reduce块默认大小1GB
只有一个reducer:没有group by;用了order by;使用了笛卡尔积

10.6 动态分区调整

(1) 尽量不要用动态分区,因为动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难。
(2) 动态分区和静态分区的区别,静态分区不管有没有数据都将会创建该分区,动态分区是有结果集将创建,否则不创建。
(3) hive动态分区的严格模式和hive提供的hive.mapred.mode的严格模式。

10.7 推测执行

触发执行一些重复的任务,通过加快获取单个任务的结果以及进行侦测将执行慢的tasktracker加入到黑名单的方式来提高整体任务的执行效率

10.8 单个MR中多个Group by

hive.multigroupby.signlemr
将多个group by组装到单个MR中

第十一章 其他文件格式和压缩方法

Hive利用Hadoop的InputFormat API来从不同的数据源读取数据
减小磁盘和网络的I/O操作,压缩、解压缩过程增加CPU开销
sequence file存储格式可以将一个文件划分成多个块,然后才用一种可分割的方式对块进行压缩

第十三章 函数

explode() array作为输入,会将array拆分为列
lateral vuew使其他字段也编程多列,配合explode(),如果array里是空,那打散后,该行不会被显示。

第十四章 Streming

streming提供了另一种处理数据的方式。在streming job中,Hadoop streming API会为外部进程开启一个I/O管道。
streming引入python处理,
select transform(line) using 'xxx.py' as col1,col2 from table

第十五章 自定义Hive文件和记录格式

15.1 文件格式

SequenceFile文件是含有key-value的二进制文件,是压缩、存储空间小的格式
RCfile https://www.cnblogs.com/bigdatafly/articles/5037794.html 行列混合

15.2 记录格式

SerDe是序列化/反序列化的简写形式。一个SerDe包含了将一条记录的非结构化字节转化成Hive可以使用的一条记录的过程。
CSVSerDe就可以处理csv格式的文件。

第十七章 存储处理程序和NoSQL

InputFormat抽象接口类,可以将不同源的数据格式化成可以作为job输入的格式。
OutputFormat抽象借口类,可以获得一个job输出,输出到一个实体中。
InputFormat和OutputFormat抽象借口可被用于从其他数据源中读取和存放数据
HDFS中典型的访问是完全顺序I/O

第十九章 锁

Hive CLI、Thrift server后者web接口实例都不是完全独立于其他实例的,因为这个独立性,所有锁必须由单独的系统进行协调。

上一篇下一篇

猜你喜欢

热点阅读