学习笔记Hive—— 查询优化

Posted 别呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记Hive—— 查询优化相关的知识,希望对你有一定的参考价值。

一、视图

1.1、Hive的视图

  • 视图是基于数据库的基本表进行创建的一种伪表,数据库中储存视图的定义,不存数据项,数据项仍然存在基本表中它可作为一个抽象层,将数据发布给下游用户。
  • 目前 Hive 版本支持逻辑视图,不支持物理视图。所以 Hive 的数据仓库目录查找不到视图,但可在 mysql 的元数据库中查找到。
  • 视图只能查询,不能进行数据的插入和修改,可以提高数据的安全性。
  • 在创建视图时候视图就已经固定,对基表的后续更改(如添加列)将不会反映在视图。
  • view定义中若包含了ORDER BY/LIMIT语句,则当查询视图时也进行ORDER BY/LIMIT语句操作,view当中定义的优先级更高。

1.2、引用视图的优点

  • 使用视图降低查询复杂度
  • 使用视图来限制基于条件过滤的数据

1.3、视图创建和应用

1.3.1、了解顾客需求

1.3.2、创建视图

CREATE VIEW [IF NOT EXISTS] [db_name.]view_name   -- 视图名称  
[(column_name [COMMENT column_comment], ...) ]    --列名 
 [COMMENT view_comment]  --视图注释  
[TBLPROPERTIES (property_name = property_value, ...)]  --额外信息  
AS SELECT ...;

1.3.3、查看与删除视图

1、查看某个视图

desc view_name;

2、查看某个视图详细信息

desc formatted view_name;

3、删除视图

DROP VIEW [IF EXISTS] [db_name.]view_name;

任务1

将以下嵌套查询中的嵌套子查询变成视图

select t.types,t.goods,t.t_g_count from (select c.types,c.goods,count(1) t_g_count,row_number() over(partition by c.types order by count(1) desc) rank from(select a.*,b.types from goodsorder a left outer join goodstypes b on a.goods=b.goods) c group by c.types,c.goods) t where rank<=10




结果(部分):


二、索引

2.1、Hive的索引

  • Hive没有主键概念,但可以建立索引,索引的设计目标是提高表某些列的查询速度。
  • 在指定列上建立索引,会产生一张索引表,里面的字段包括:索引列的值、该值对应的HDFS文件路径、该值在文件中的偏移量。
  • 在查询涉及到索引字段时,首先到索引表查找索引列值对应的HDFS文件路径及偏移量,这样就避免了全表扫描。

索引表:


2.2、索引的优点

  • 可以避免全表扫描和资源浪费
  • 可以加快含有group by的语句的查询速度

2.3、索引创建和应用

2.3.1、创建索引

CREATE INDEX index_name     --索引名称  
ON TABLE base_table_name (col_name, ...)  --建立索引的列  
AS index_type    --索引类型  
[WITH DEFERRED REBUILD]    --重建索引 
 [IDXPROPERTIES (property_name=property_value, ...)]  --索引额外属性 
 [IN TABLE index_table_name]    --索引表的名字 
 [     [ ROW FORMAT ...] STORED AS ...      
 | STORED BY ...  ]   --索引表行分隔符 、 存储格式 
 [LOCATION hdfs_path]  --索引表存储位置 
 [TBLPROPERTIES (...)]   --索引表表属性  
[COMMENT "index comment"];  --索引注释

2.3.2、自动使用索引

(创建索引之前设置)

SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
SET hive.optimize.index.filter=true;
SET hive.optimize.index.filter.compact.minsize=0;

2.3.3、查看和删除索引

1、显示表上所有列的索引

SHOW FORMATTED INDEX ON table_name;

2、删除索引

DROP INDEX [IF EXISTS] index_name ON table_name;

任务2

1、为goodsorders id字段创建索引

2、查询id=10的顾客的订单

3、按照id分组统计每个顾客购买商品数量


三、存储格式

3.1、文件存储格式

  • 指Hive表数据存储的格式
  • 默认是文本文件格式
  • 有行存储和列存储

3.2、存储格式设置

STORED AS (TextFile|RCFile|SequenceFile|ORC|Parquet)
存储格式存储方式压缩方式特点
textFile按行存储Gzip,Bzip2存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高
SequenceFile按行存储NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载
RCFile按列存储存储空间小,查询的效率高 ,需要通过text文件转化来加载,加载的速度低。压缩快 快速列存取。读取全量数据的操作 性能可能比sequencefile没有明显的优势
ORCFile按列存储zlib(default),snappy压缩快,快速列存取 ,效率比rcfile高,是rcfile的改良版本,不支持其他的查询引擎, 比如impala
parquet按列存储Parquet压缩比较低,查询效率较低,不支持update、insert和ACID.但是Parquet支持Impala查询引擎

默认是TextFile存储格式

Impala是CloudParquet和ORC有很多相似之处, 但是Parquet更有意成为hadoop上通用的存储格式. 它可以与impala, Spark, Pig等引擎结合使用. 它可以指定每一列的压缩方式, 从而实现更高效的压缩. Parquet旨在设计为支持复杂嵌套数据的存储, 比如json


任务3

数据(person.parquet):

1,Tom,23
2,Kate,24
3,Betty,22
4,Ketty,23
5,Jhon,21

1、创建表person,设置表的数据存储格式为parquet

2、将user.parquet文件存入表中

3、查询数据

以上是关于学习笔记Hive—— 查询优化的主要内容,如果未能解决你的问题,请参考以下文章

Hive 优化笔记

Hive 查询进阶笔记

Hive 系统性学习笔记

Hive 系统性学习笔记

学习笔记Hive —— Hive应用—— Hive查询

hive学习笔记_hive的介绍与安装