学习笔记Hive(八)—— 查询优化
生活随笔
收集整理的這篇文章主要介紹了
学习笔记Hive(八)—— 查询优化
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、視圖
1.1、Hive的視圖
- 視圖是基于數(shù)據(jù)庫(kù)的基本表進(jìn)行創(chuàng)建的一種偽表,數(shù)據(jù)庫(kù)中儲(chǔ)存視圖的定義,不存數(shù)據(jù)項(xiàng),數(shù)據(jù)項(xiàng)仍然存在基本表中它可作為一個(gè)抽象層,將數(shù)據(jù)發(fā)布給下游用戶。
- 目前 Hive 版本支持邏輯視圖,不支持物理視圖。所以 Hive 的數(shù)據(jù)倉(cāng)庫(kù)目錄查找不到視圖,但可在 Mysql 的元數(shù)據(jù)庫(kù)中查找到。
- 視圖只能查詢,不能進(jìn)行數(shù)據(jù)的插入和修改,可以提高數(shù)據(jù)的安全性。
- 在創(chuàng)建視圖時(shí)候視圖就已經(jīng)固定,對(duì)基表的后續(xù)更改(如添加列)將不會(huì)反映在視圖。
- view定義中若包含了ORDER BY/LIMIT語(yǔ)句,則當(dāng)查詢視圖時(shí)也進(jìn)行ORDER BY/LIMIT語(yǔ)句操作,view當(dāng)中定義的優(yōu)先級(jí)更高。
1.2、引用視圖的優(yōu)點(diǎn)
- 使用視圖降低查詢復(fù)雜度
- 使用視圖來(lái)限制基于條件過(guò)濾的數(shù)據(jù)
1.3、視圖創(chuàng)建和應(yīng)用
1.3.1、了解顧客需求
1.3.2、創(chuàng)建視圖
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、查看某個(gè)視圖
desc view_name;2、查看某個(gè)視圖詳細(xì)信息
desc formatted view_name;3、刪除視圖
DROP VIEW [IF EXISTS] [db_name.]view_name;任務(wù)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
結(jié)果(部分):
二、索引
2.1、Hive的索引
- Hive沒(méi)有主鍵概念,但可以建立索引,索引的設(shè)計(jì)目標(biāo)是提高表某些列的查詢速度。
- 在指定列上建立索引,會(huì)產(chǎn)生一張索引表,里面的字段包括:索引列的值、該值對(duì)應(yīng)的HDFS文件路徑、該值在文件中的偏移量。
- 在查詢涉及到索引字段時(shí),首先到索引表查找索引列值對(duì)應(yīng)的HDFS文件路徑及偏移量,這樣就避免了全表掃描。
索引表:
2.2、索引的優(yōu)點(diǎn)
- 可以避免全表掃描和資源浪費(fèi)
- 可以加快含有g(shù)roup by的語(yǔ)句的查詢速度
2.3、索引創(chuàng)建和應(yīng)用
2.3.1、創(chuàng)建索引
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 ... ] --索引表行分隔符 、 存儲(chǔ)格式 [LOCATION hdfs_path] --索引表存儲(chǔ)位置 [TBLPROPERTIES (...)] --索引表表屬性 [COMMENT "index comment"]; --索引注釋2.3.2、自動(dòng)使用索引
(創(chuàng)建索引之前設(shè)置)
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;任務(wù)2
1、為goodsorders id字段創(chuàng)建索引
2、查詢id=10的顧客的訂單
3、按照id分組統(tǒng)計(jì)每個(gè)顧客購(gòu)買商品數(shù)量
三、存儲(chǔ)格式
3.1、文件存儲(chǔ)格式
- 指Hive表數(shù)據(jù)存儲(chǔ)的格式
- 默認(rèn)是文本文件格式
- 有行存儲(chǔ)和列存儲(chǔ)
3.2、存儲(chǔ)格式設(shè)置
STORED AS (TextFile|RCFile|SequenceFile|ORC|Parquet)| textFile | 按行存儲(chǔ) | Gzip,Bzip2 | 存儲(chǔ)空間消耗比較大,并且壓縮的text 無(wú)法分割和合并 查詢的效率最低,可以直接存儲(chǔ),加載數(shù)據(jù)的速度最高 |
| SequenceFile | 按行存儲(chǔ) | NONE,RECORD,BLOCK。Record壓縮率低,一般建議使用BLOCK壓縮 | 存儲(chǔ)空間消耗最大,壓縮的文件可以分割和合并 查詢效率高,需要通過(guò)text文件轉(zhuǎn)化來(lái)加載 |
| RCFile | 按列存儲(chǔ) | 存儲(chǔ)空間小,查詢的效率高 ,需要通過(guò)text文件轉(zhuǎn)化來(lái)加載,加載的速度低。壓縮快 快速列存取。讀取全量數(shù)據(jù)的操作 性能可能比sequencefile沒(méi)有明顯的優(yōu)勢(shì) | |
| ORCFile | 按列存儲(chǔ) | zlib(default),snappy | 壓縮快,快速列存取 ,效率比rcfile高,是rcfile的改良版本,不支持其他的查詢引擎, 比如impala |
| parquet | 按列存儲(chǔ) | Parquet壓縮比較低,查詢效率較低,不支持update、insert和ACID.但是Parquet支持Impala查詢引擎 |
默認(rèn)是TextFile存儲(chǔ)格式
Impala是CloudParquet和ORC有很多相似之處, 但是Parquet更有意成為hadoop上通用的存儲(chǔ)格式. 它可以與impala, Spark, Pig等引擎結(jié)合使用. 它可以指定每一列的壓縮方式, 從而實(shí)現(xiàn)更高效的壓縮. Parquet旨在設(shè)計(jì)為支持復(fù)雜嵌套數(shù)據(jù)的存儲(chǔ), 比如json
任務(wù)3
數(shù)據(jù)(person.parquet):
1,Tom,23 2,Kate,24 3,Betty,22 4,Ketty,23 5,Jhon,211、創(chuàng)建表person,設(shè)置表的數(shù)據(jù)存儲(chǔ)格式為parquet
2、將user.parquet文件存入表中
3、查詢數(shù)據(jù)
總結(jié)
以上是生活随笔為你收集整理的学习笔记Hive(八)—— 查询优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 学习笔记Hive(七)—— 自定义函数
- 下一篇: 学习笔记Hive(九)—— 实例:航空客