您好,登錄后才能下訂單哦!
本篇內容主要講解“如何創建Hive分區”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何創建Hive分區”吧!
Hive分區的概念與傳統關系型數據庫分區不同。
傳統數據庫的分區方式:就oracle而言,分區獨立存在于段里,里面存儲真實的數據,在數據進行插入的時候自動分配分區。
Hive的分區方式:由于Hive實際是存儲在HDFS上的抽象,Hive的一個分區名對應一個目錄名,子分區名就是子目錄名,并不是一個實際字段。
所以可以這樣理解,當我們在插入數據的時候指定分區,其實就是新建一個目錄或者子目錄,或者在原有的目錄上添加數據文件。
Hive分區是在創建表的時候用Partitioned by 關鍵字定義的,但要注意,Partitioned by子句中定義的列是表中正式的列,但是Hive下的數據文件中并不包含這些列,因為它們是目錄名。
創建一張靜態分區表par_tab,單個分區
create table par_tab (name string,nation string) partitioned by (sex string) row format delimited fields terminated by ',';
這時候通過desc查看的表結構如下
hive> desc par_tab; OK name string nation string sex string # Partition Information # col_name data_type comment sex string Time taken: 0.038 seconds, Fetched: 8 row(s)
準備本地數據文件par_tab.txt,內容 “名字/國籍”,將以性別(sex)作為分區
jan,china mary,america lilei,china heyong,china yiku,japan emoji,japan
把數據插入到表(其實load操作相當于把文件移動到HDFS的Hive目錄下)
load data local inpath '/home/hadoop/files/par_tab.txt' into table par_tab partition (sex='man');
這時候在hive下查詢par_tab表,變成了3列,注意。
hive> select * from par_tab; OK jan china man mary america man lilei china man heyong china man yiku japan man emoji japan man Time taken: 0.076 seconds, Fetched: 6 row(s)
查看par_tab目錄結構
[hadoop@hadoop001 files]$ hadoop dfs -lsr /user/hive/warehouse/par_tab drwxr-xr-x - hadoop supergroup 0 2017-03-29 08:25 /user/hive/warehouse/par_tab/sex=man-rwxr-xr-x 1 hadoop supergroup 71 2017-03-29 08:25 /user/hive/warehouse/par_tab/sex=man/par_tab.txt
可以看到,在新建分區表的時候,系統會在hive數據倉庫默認路徑/user/hive/warehouse/下創建一個目錄(表名),再創建目錄的子目錄sex=man(分區名),最后在分區名下存放實際的數據文件。
如果再插入另一個數據文件數據,如文件
lily,china nancy,china hanmeimei,america
插入數據
load data local inpath '/home/hadoop/files/par_tab_wm.txt' into table par_tab partition (sex='woman');
查看par_tab表目錄結構
[hadoop@hadoop001 files]$ hadoop dfs -lsr /user/hive/warehouse/par_tab drwxr-xr-x - hadoop supergroup 0 2017-03-29 08:25 /user/hive/warehouse/par_tab/sex=man-rwxr-xr-x 1 hadoop supergroup 71 2017-03-29 08:25 /user/hive/warehouse/par_tab/sex=man/par_tab.txt drwxr-xr-x - hadoop supergroup 0 2017-03-29 08:35 /user/hive/warehouse/par_tab/sex=woman-rwxr-xr-x 1 hadoop supergroup 41 2017-03-29 08:35 /user/hive/warehouse/par_tab/sex=woman/par_tab_wm.txt
最后查看兩次插入的結果,包含了man和woman
hive> select * from par_tab; OK jan china manmary america manlilei china manheyong china manyiku japan manemoji japan manlily china woman nancy china woman hanmeimei america woman Time taken: 0.136 seconds, Fetched: 9 row(s)
因為分區列是表實際定義的列,所以查詢分區數據時
hive> select * from par_tab where sex='woman'; OK lily china woman nancy china woman hanmeimei america woman Time taken: 0.515 seconds, Fetched: 3 row(s)
下面創建一張靜態分區表par_tab_muilt,多個分區(性別+日期)
hive> create table par_tab_muilt (name string, nation string) partitioned by (sex string,dt string) row format delimited fields terminated by ',' ; hive> load data local inpath '/home/hadoop/files/par_tab.txt' into table par_tab_muilt partition (sex='man',dt='2017-03-29'); [hadoop@hadoop001 files]$ hadoop dfs -lsr /user/hive/warehouse/par_tab_muilt drwxr-xr-x - hadoop supergroup 0 2017-03-29 08:45 /user/hive/warehouse/par_tab_muilt/sex=mandrwxr-xr-x - hadoop supergroup 0 2017-03-29 08:45 /user/hive/warehouse/par_tab_muilt/sex=man/dt=2017-03-29-rwxr-xr-x 1 hadoop supergroup 71 2017-03-29 08:45 /user/hive/warehouse/par_tab_muilt/sex=man/dt=2017-03-29/par_tab.txt
可見,新建表的時候定義的分區順序,決定了文件目錄順序(誰是父目錄誰是子目錄),正因為有了這個層級關系,當我們查詢所有man的時候,man以下的所有日期下的數據都會被查出來。如果只查詢日期分區,但父目錄sex=man和sex=woman都有該日期的數據,那么Hive會對輸入路徑進行修剪,從而只掃描日期分區,性別分區不作過濾(即查詢結果包含了所有性別)。
如果用上述的靜態分區,插入的時候必須首先要知道有什么分區類型,而且每個分區寫一個load data,太煩人。使用動態分區可解決以上問題,其可以根據查詢得到的數據動態分配到分區里。其實動態分區與靜態分區區別就是不指定分區目錄,由系統自己選擇。
首先,啟動動態分區功能
hive> set hive.exec.dynamic.partition=true;
假設已有一張表par_tab,前兩列是名稱name和國籍nation,后兩列是分區列,性別sex和日期dt,數據如下
hive> select * from par_tab; OK lily china man 2013-03-28nancy china man 2013-03-28hanmeimei america man 2013-03-28jan china man 2013-03-29mary america man 2013-03-29lilei china man 2013-03-29heyong china man 2013-03-29yiku japan man 2013-03-29emoji japan man 2013-03-29Time taken: 1.141 seconds, Fetched: 9 row(s)
現在我把這張表的內容直接插入到另一張表par_dnm中,并實現sex為靜態分區,dt動態分區(不指定到底是哪日,讓系統自己分配決定)
hive> insert overwrite table par_dnm partition(sex='man',dt)> select name, nation, dt from par_tab;
插入后看下目錄結構
drwxr-xr-x - hadoop supergroup 0 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=mandrwxr-xr-x - hadoop supergroup 0 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man/dt=2013-03-28-rwxr-xr-x 1 hadoop supergroup 41 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man/dt=2013-03-28/000000_0 drwxr-xr-x - hadoop supergroup 0 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man/dt=2013-03-29-rwxr-xr-x 1 hadoop supergroup 71 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man/dt=2013-03-29/000000_0
再查看分區數
hive> show partitions par_dnm; OK sex=man/dt=2013-03-28sex=man/dt=2013-03-29Time taken: 0.065 seconds, Fetched: 2 row(s)
證明動態分區成功。
注意,動態分區不允許主分區采用動態列而副分區采用靜態列,這樣將導致所有的主分區都要創建副分區靜態列所定義的分區。
動態分區可以允許所有的分區列都是動態分區列,但是要首先設置一個參數hive.exec.dynamic.partition.mode :
hive> set hive.exec.dynamic.partition.mode; hive.exec.dynamic.partition.mode=strict
它的默認值是strick,即不允許分區列全部是動態的,這是為了防止用戶有可能原意是只在子分區內進行動態建分區,但是由于疏忽忘記為主分區列指定值了,這將導致一個dml語句在短時間內創建大量的新的分區(對應大量新的文件夾),對系統性能帶來影響。
所以我們要設置:
hive> set hive.exec.dynamic.partition.mode=nostrick;
到此,相信大家對“如何創建Hive分區”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。