大數據發展到今天,扮演了越來越重要的作用。數據可以為各種組織和企業提供關鍵決策的支持,也可以通過數據分析幫助發現更多的有價值的東西,如商機、風險等等。 在數據治理工作開展的時候,往往會有一個專門負責數據治理工作的負責人,他和大數據的負責人共同保證數據的可靠性,合法合規性。因為只有這樣的數據才是有價值 ...
文末查看關鍵字,回覆贈書
一、理論基礎
1.Hive分區背景
在Hive Select查詢中一般會掃描整個表內容,會消耗很多時間做沒必要的工作。有時候只需要掃描表中關心的一部分數據,因此建表時引入了partition概念。
2.Hive分區實質
因為Hive實際是存儲在HDFS上的抽象,Hive的一個分區名對應hdfs的一個目錄名,並不是一個實際欄位。
3.Hive分區的意義
輔助查詢,縮小查詢範圍,加快數據的檢索速度和對數據按照一定的規格和條件進行查詢,更方便數據管理。
4.常見的分區技術
hive表中的數據一般按照時間、地域、類別等維度進行分區。
二、單分區操作
1.創建分區表
create table if not exists t1(
id int
,name string
,hobby array
,add map
)
partitioned by (pt_d string)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
;
註:這裡分區欄位不能和表中的欄位重覆。
如果分區欄位和表中欄位相同的話,會報錯,如下:
create table t10(
id int
,name string
,hobby array<string>
,add maptring,string>
)
partitioned by (id int)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
;
報錯信息:FAILED: SemanticException [Error 10035]: Column repeated in partitioning columns
2.裝載數據
需要載入的文件內容如下:
1,xiaoming,book-TV-code,beijing:chaoyang-shagnhai:pudong
2,lilei,book-code,nanjing:jiangning-taiwan:taibei
3,lihua,music-book,heilongjiang:haerbin
執行load data
load data local inpath '/home/hadoop/Desktop/data' overwrite into table t1 partition ( pt_d = '201701');
3.查看數據及分區
查看分區數據,使用和欄位使用一致。
select * from t1 where pt_d = '201701';
結果
1 xiaoming ["book","TV","code"] {"beijing":"chaoyang","shagnhai":"pudong"} 201701
2 lilei ["book","code"] {"nanjing":"jiangning","taiwan":"taibei"} 201701
3 lihua ["music","book"] {"heilongjiang":"haerbin"} 201701
查看分區
show partitions t1;
4.插入另一個分區
再創建一份數據並裝載,分區=‘000000’
load data local inpath '/home/hadoop/Desktop/data' overwrite into table t1 partition ( pt_d = '000000');
查看數據:
select * from t1;
1 xiaoming ["book","TV","code"] {"beijing":"chaoyang","shagnhai":"pudong"} 000000
2 lilei ["book","code"] {"nanjing":"jiangning","taiwan":"taibei"} 000000
3 lihua ["music","book"] {"heilongjiang":"haerbin"} 000000
1 xiaoming ["book","TV","code"] {"beijing":"chaoyang","shagnhai":"pudong"} 201701
2 lilei ["book","code"] {"nanjing":"jiangning","taiwan":"taibei"} 201701
3 lihua ["music","book"] {"heilongjiang":"haerbin"} 201701
5.觀察HDFS上的文件
去hdfs上看文件
http://namenode:50070/explorer.html#/user/hive/warehouse/test.db/t1
可以看到,文件是根據分區分別存儲,增加一個分區就是一個文件。
查詢相應分區的數據
select * from t1 where pt_d = ‘000000’
添加分區,增加一個分區文件
alter table t1 add partition (pt_d = ‘333333’);
刪除分區(刪除相應分區文件)
註意,對於外表進行drop partition並不會刪除hdfs上的文件,並且通過msck repair table table_name可以同步回hdfs上的分區。
alter table test1 drop partition (pt_d = ‘20170101’);
三、多個分區操作
1.創建分區表
create table t10(
id int
,name string
,hobby array<string>
,add maptring,string>
)
partitioned by (pt_d string,sex string)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
;
2.載入數據(分區欄位必須都要加)
load data local inpath ‘/home/hadoop/Desktop/data’ overwrite into table t10 partition ( pt_d = ‘0’);
如果只是添加一個,會報錯:FAILED: SemanticException [Error 10006]: Line 1:88 Partition not found ”0”
load data local inpath '/home/hadoop/Desktop/data' overwrite into table t10 partition ( pt_d = '0',sex='male');
load data local inpath '/home/hadoop/Desktop/data' overwrite into table t10 partition ( pt_d = '0',sex='female');
觀察HDFS上的文件,可發現多個分區具有順序性,可以理解為windows的樹狀文件夾結構。
四、表分區的增刪修查
1.增加分區
這裡我們創建一個分區外部表
create external table testljb (
id int
) partitioned by (age int);
添加分區
官網說明:
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];
partition_spec:
: (partition_column = partition_col_value, partition_column = partition_col_value, ...)
實例說明
- 一次增加一個分區
alter table testljb add partition (age=2);
- 一次增加多個同級(分區名相同)分區
alter table testljb add partition(age=3) partition(age=4);
- 註意:一定不能寫成如下方式:
alter table testljb add partition(age=5,age=6);
如果我們show partitions table_name 會發現僅僅添加了age=6的分區。
這裡猜測原因:因為這種寫法實際上:具有多個分區欄位表的分區添加,而我們寫兩次同一個欄位,而系統中並沒有兩個age分區欄位,那麼就會隨機添加其中一個分區。
父子級分區增加:
舉個例子,有個表具有兩個分區欄位:age分區和sex分區。那麼我們添加一個age分區為1,sex分區為male的數據,可以這樣添加:
alter table testljb add partition(age=1,sex='male');
2.刪除分區
刪除分區age=1
alter table testljb drop partition(age=1);
註:加入表testljb有兩個分區欄位(上文已經提到多個分區先後順序類似於windows的文件夾的樹狀結構),partitioned by(age int ,sex string),那麼我們刪除age分區(第一個分區)時,會把該分區及其下麵包含的所有sex分區一起刪掉。
3.修複分區
修複分區就是重新同步hdfs上的分區信息。
msck repair table table_name;
4.查詢分區
show partitions table_name;
上一篇:數據倉庫與數據集市建模
下期預告:hive的動態分區與靜態分區
按例,我的個人公眾號:魯邊社,歡迎關註
後臺回覆關鍵字 [hive],隨機贈送一本魯邊備註版珍藏大數據書籍。