学习笔记Hive(八)—— 查询优化
生活随笔
收集整理的這篇文章主要介紹了
学习笔记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,211、創建表person,設置表的數據存儲格式為parquet
2、將user.parquet文件存入表中
3、查詢數據
總結
以上是生活随笔為你收集整理的学习笔记Hive(八)—— 查询优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习笔记Hive(七)—— 自定义函数
- 下一篇: 学习笔记Hive(九)—— 实例:航空客