hive进阶
- hive的调优
- explain查看执行计划
- hive建表优化
- hql语法优化
- 数据倾斜(重点)优化
- hive job优化
- hive on spark
- hive的源码
- hive如何转换为mr任务(框架)
- hive如何转换为mr任务(源码)重点 有个框架是很细的
- hive源码debug模式调试介绍
explain查看执行计划
- 不可能每次优化都执行一次,执行几个小时,因此需要通过explain查看执行计划,看优化是否达到目标;
- 一般就是
expain select click_url fron bigtable
- 里面分了stage 有fetch operator操作;
hive的建表优化
-
Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。 在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多,所以我们需要把常常用在 WHERE 语句中的字段指定为表的分区字段;
-
partitoned by (day string)
row format delimited fileds terminated by '\t'
-
分区表加载数据时,必须指定分区;
-
增加分区
alter table t_name add partition(day='20200404');
-
删除分区
alter table t_name drop partition(...)
-
查看分区表有多少分区
show partitions t_name
-
查看分区表结构
desc formatted t_name
-
二级分区(数据量很多的时候),动态分区(insert数据的时候,自动根据分区字段的值,将数据对应插入);
-
分桶表:分区针对的是数据的存储路径,分桶针对的是数据文件。
-
Hive 可以进一步组织成桶,也就是更为细粒度的数据范围划分。
-
clustered by
into 4 bucks
-
分桶规则:Hive 的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中
-
适合于抽样查询:有时用户需要使用的是一个具有代表性的查询结果而不是全部结果
-
合适的文件格式:行 TEXTFILE 、SEQUENCEFILE、 列:ORC、PARQUET
-
行存储的场景:查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快(
select *
) -
列存储的场景:因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。(
select 一列
) -
TextFile 格式 默认格式,数据不做压缩,磁盘开销大,数据解析开销大
-
Orc 行存储
-
Parquet 格式:Parquet 文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此 Parquet 格式文件是自解析的
-
合适的压缩格式:主要是 LZO 和 Snappy
-
name 支持切片? 是否自带 后缀名? 算法? 原来的程序时候需要修改? LZO 是 否 .lzo lzo 需要建索引,还需要指定输入格式 snappy 否 否 .snappy snappy 不需要
hql语法优化
-
单表查询的优化:
-
列裁剪与分区裁剪
- 列裁剪就是在查询时只读取需要的列</