1.HIVE 分區表
在 hive select 查詢中一般會掃描整個內容,消耗很多時間組沒必要的工作.有時候只需要掃描表中的一部分關心的數據,因此建表時引入了partition 概念.
分區表指的是在創建表時指定的partition的分區空間,Hive可以對數據按照某列或者某些列進行分區管理
\舉個例子:當前互聯網應用每天都要存儲大量的日誌文件,幾G、幾十G甚至更大都是有可能。存儲日誌,其中必然有個屬性是日誌產生的日期。在產生分區時,就可以按照日誌產生的日期列進行劃分。把每一天的日誌當作一個分區
將數據組織成分區,主要可以提高數據的查詢速度.至於用戶儲存的每一條記錄到底放在哪個分區,由用戶來決定.即用戶在加載數據的時候必須現實地指定該部分數據放到哪.個分區
1.1實現細節
- 一個表可以擁有一個或者多個分區,每個分區以文件夾的形式單獨存放在表文件夾的目錄下
- 表和列名不區分大小寫
- 分區十一字段的形式在表結構中存在,通過describe table 命令可以查看到字段存在,但是該字段不存放實際的數據內容,僅僅是分區的表示
1.2語法
創建一個分區表:
create table table_name(
id int ,name string)
partitioned by (year int, month int)
row format delimited
fields terminated by '|'
collection items terminated by ','
map keys terminated by ':'
添加分區
alter table table_name add partition (year=2017,month=6) partition (year=2017,month=7) partition (year=2018,month=8);
動態分區的添加(在添加數據時自動生成分區)
注意:用戶必須現制定一個靜態分區列
先確認配置爲true
set hive.exec.dynamic.partition
確認爲true後再修改 hive.exec.dynamic.paritition.mode=nonstrict
set hive.exec.dynamic.partition.mode=nonstrict
自動添加一個沒有的2018-9的分區
insert into table table_name partition (year=2018,month) values ('lisi','2018-8-12',8),('zhangsan','2018-9-10',9);
2.nonstrictHive 桶
對於每個表(table) 或者分區,hive 可以進一步組織成桶,也就是說桶時更爲精細的數據範圍劃分.hive 也是針對某一列進行桶的組織. hive採用隊列值哈希,然後除以桶的個數求餘的方式決定該條記錄存放在那個桶中
把表(或者分區)組織成桶有兩個理由:
(1)獲得更高的查詢處理效率.桶爲表加上了額外的結構,hive 在處理有些查詢時利用這個結構,具體而言,連接兩個在相同列上劃分了桶的表,可以用map連接(map-side join) 高效的實現.比如join操作 對於join操作兩個表有一個相同的列,如果對這兩個表都進行了桶操作,那麼將保存相同列值的通進行join操作就可以,可以大大減少join的數據量
(2)取樣更高效.在處理大規模數據集時,在開發和修改查詢的階段,如果能在數據集的一小部分數據上試運行查詢,會帶來很多方便
2.1語法
create table bucketed_user(
id int,name string)
clustered by (bucketed_user) into 2 buckets
row format delimited
fields terminated by '|'
collection items terminated by','
map keys terminated by ':'
stored as textfile;
隨機抽樣基於整行數據
select * from table_name tablesample(bucket 3 out of 32 on rand()) s;
隨機抽樣基於指定列(使用分桶列更高效)
select * from table_name tablesample(bucket 3 out of 32 on id) s;
隨機抽樣基於block size
SELECT * FROM table_name TABLESAMPLE(10 PERCENT) s;
SELECT * FROM table_name TABLESAMPLE(1M) s;
SELECT * FROM table_name TABLESAMPLE(10 rows) s;
3.Hive 視圖常用操作
語法:
- 建立視圖: create view view_name as select statement;
- 建立視圖支持 CTE,ORDER BY,LIMIT,JOIN,etc
- 查找視圖 show tables;(show views after hive v2.2.0)
- 顯示view :show create table view_name;
- 刪除視圖:drop view_name;
- 更改視圖屬性 :alter view view_name set tblproperties('comment'='This is view');
- 更改視圖定義:alter view view_name as select statement;
Hive 排序
- order by 會對數據進行全局排序,和oracle和mysql等數據庫中的order by 效果一樣,他只在一個reduce中進行,所以數據量特別大的時候效率特別低
- sort by 是單獨在各自的reduce中進行排序,所以並不能保證全局排序,一般和distribute by一起執行,而且distribute by 要寫在sort by 前面
- distribute by 會對指定的字段按照hashCode值對reduce的個數取模,然後將任務分配到對應的reduce中去執行,就是在mapreduce程序中的patition分區過程,默認根據指定key.hashCode()確定處理該人物的reduce
- cluster by :distribute by 和sort by 合用就相當於cluster by 但是 cluster不能指定排序asc或者desc的規則,只能是desc倒序排列
Hive 數據的導入與導出
load data 加 local 和不加local的區別
```local 是導入本地文件 採用複製方式
```不加local 是導入hdfs數據 採用剪切
use school;
export table class to 'tmp/out'(先將表導出到hdfs文件夾)
use school;
import table class2 from 'tmp/out'(再從dfs文件中導入新的表中)
HIVE 排序
row_number: 排名不重複,序號連續
rank:排名重複序號不連續
dense_rank:排名重複,序號連續