柚子快報激活碼778899分享:hadoop hive中的分區(qū)
柚子快報激活碼778899分享:hadoop hive中的分區(qū)
文章目錄
Hive分區(qū)1.簡介為什么要分區(qū)如何分區(qū)以及細節(jié)
2.Hive分區(qū)的建立創(chuàng)建分區(qū)靜態(tài)分區(qū)動態(tài)分區(qū)啟動動態(tài)分區(qū)功能多分區(qū)單分區(qū)區(qū)別創(chuàng)建多分區(qū)插入分區(qū)查看分區(qū)數(shù)查看表結(jié)構(gòu)
Hive分區(qū)
1.簡介
Hive分區(qū)的概念與傳統(tǒng)關(guān)系型數(shù)據(jù)庫分區(qū)不一樣。
傳統(tǒng)數(shù)據(jù)庫的分區(qū)方式:就oracle而言,分區(qū)獨立存在于段里,里面存儲真實的數(shù)據(jù),在數(shù)據(jù)進行插入的時候自動分配分區(qū)。
Hive的分區(qū)方式:因為Hive實際是存儲在HDFS上的抽象,Hive的一個分區(qū)名對應(yīng)一個目錄名,子分區(qū)名就是子目錄名,并非一個實際字段。
因此能夠這樣理解,當在插入數(shù)據(jù)的時候指定分區(qū),其實就是新建一個目錄或者子目錄,或者在原有的目錄上添加數(shù)據(jù)文件。
為什么要分區(qū)
1、在Hive Select查詢中一般會掃描整個表內(nèi)容,會消耗很多時間做沒必要的工作。有時候只需要掃描表中關(guān)心的一部分數(shù)據(jù),因此建表時引入了partition概念。
2、分區(qū)表指的是在創(chuàng)建表時指定的partition的分區(qū)空間。
3、如果需要創(chuàng)建有分區(qū)的表,需要在create表的時候調(diào)用可選參數(shù)partitioned by。
如何分區(qū)以及細節(jié)
根據(jù)業(yè)務(wù)分區(qū),(完全看業(yè)務(wù)場景)選取id、年、月、日、男女性別、年齡段 或者是能平均將數(shù)據(jù)分到不同文件中最好,分區(qū)不好將直接導(dǎo)致查詢結(jié)果延遲。
分區(qū)細節(jié):
一個表可以擁有一個或者多個分區(qū),每個分區(qū)以文件夾的形式單獨存在表文件夾的目錄下; 表和列名不區(qū)分大小寫; 分區(qū)是以字段的形式在表結(jié)構(gòu)中存在,但是該字段不存放實際的數(shù)據(jù)內(nèi)容,僅僅是分區(qū)的表示; 分區(qū)有一級、二級設(shè)置一般設(shè)置為一級分區(qū); 分區(qū)分為動態(tài)分區(qū)和靜態(tài)分區(qū)。
2.Hive分區(qū)的建立
Hive分區(qū)是在建立表的時候用Partitioned by 關(guān)鍵字定義的,但要注意,Partitioned by子句中定義的列是表中正式的列,可是Hive下的數(shù)據(jù)文件中并不包含這些列,由于它們是目錄名。
創(chuàng)建分區(qū)
CREATE TABLE `udata_partition`(
`user_id` string,
`item_id` string,
`rating` int)
PARTITIONED BY (`dt` string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
靜態(tài)分區(qū)
每個分區(qū)要寫一個load data,缺點:load data 效率低下,非常繁瑣,不常用靜態(tài)分區(qū)在業(yè)務(wù)中
建立一張靜態(tài)分區(qū)表par_tab,單個分區(qū)
create table par_tab (name string,nation string) partitioned by (sex string) row format delimited fields terminated by ',';
把數(shù)據(jù)插入到表(其實load操做至關(guān)于把文件移動到HDFS的Hive目錄下)
load data local inpath '/home/hadoop/files/par_tab.txt' into table par_tab partition (sex='man');
能夠看到,在新建分區(qū)表的時候,系統(tǒng)會在hive數(shù)據(jù)倉庫下建立一個目錄,再建立目錄的子目錄sex=man(分區(qū)名),最后在分區(qū)名下存放實際的數(shù)據(jù)文件。
新建表的時候設(shè)置多分區(qū),定義的分區(qū)順序,決定了文件目錄順序(誰是父目錄誰是子目錄)
動態(tài)分區(qū)
若是用上述的靜態(tài)分區(qū),插入的時候必須首先要知道有什么分區(qū)類型,并且每一個分區(qū)寫一個load data,比較麻煩。使用動態(tài)分區(qū)可解決以上問題,其能夠根據(jù)查詢獲得的數(shù)據(jù)動態(tài)分配到分區(qū)里。其實動態(tài)分區(qū)與靜態(tài)分區(qū)區(qū)別就是不指定分區(qū)目錄,由系統(tǒng)本身選擇。
不確定分區(qū)數(shù)量,數(shù)據(jù)量也不是很大,使用動態(tài)分區(qū)
啟動動態(tài)分區(qū)功能
hive> set hive.exec.dynamic.partition=true;
多分區(qū)單分區(qū)區(qū)別
創(chuàng)建多分區(qū)
hive> create table tablename (name string, nation string) partitioned by (p1 string,dt string) row format delimited fields terminated by ',' ;
插入分區(qū)
第一個分區(qū)為主分區(qū),多分區(qū)默認模式為 主靜副動,動態(tài)分區(qū)不容許主分區(qū)采用動態(tài)列而副分區(qū)采用靜態(tài)列,這樣將致使全部的主分區(qū)都要建立副分區(qū)靜態(tài)列所定義的分區(qū)。
hive> insert overwrite table par_dnm partition(分區(qū)字段1='設(shè)置值',dt)
> select name, nation, dt from par_tab;
select 的的name,nation 對應(yīng) 要插入表的第1,2個字段,分區(qū)字段1 為靜態(tài)分區(qū)直接設(shè)置的默認值的,查詢的dt 對應(yīng)分區(qū)字段dt完成動態(tài)分區(qū)(根據(jù)查詢出來的dt自行分區(qū))。
動態(tài)分區(qū)能夠容許全部的分區(qū)列都是動態(tài)分區(qū)列,可是要首先設(shè)置一個參數(shù)
查看分區(qū)設(shè)置模式
hive> set hive.exec.dynamic.partition.mode;
hive.exec.dynamic.partition.mode=strict
它的默認值是strict,即不容許分區(qū)列所有是動態(tài)的,這是為了防止用戶有可能原意是只在子分區(qū)內(nèi)進行動態(tài)建分區(qū),可是因為疏忽忘記為主分區(qū)列指定值了,這將致使一個dml語句在短期內(nèi)建立大量的新的分區(qū)(對應(yīng)大量新的文件夾),對系統(tǒng)性能帶來影響。 因此要設(shè)置
hive> set hive.exec.dynamic.partition.mode=nostrict;
查看分區(qū)數(shù)
hive> show partitions tablename;
查看表結(jié)構(gòu)
show create table tablename ;
設(shè)置分區(qū)數(shù)量
set hive.exec.max.dynamic.partitions.pernode=1000;
柚子快報激活碼778899分享:hadoop hive中的分區(qū)
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。