欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何創(chuàng)建Hive分區(qū)

本篇內容主要講解“如何創(chuàng)建Hive分區(qū)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何創(chuàng)建Hive分區(qū)”吧!

浦北網(wǎng)站建設公司成都創(chuàng)新互聯(lián)公司,浦北網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經驗。已為浦北數(shù)千家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿網(wǎng)站建設公司要多少錢,請找那個售后服務好的浦北做網(wǎng)站的公司定做!

Hive分區(qū)的概念與傳統(tǒng)關系型數(shù)據(jù)庫分區(qū)不同。

傳統(tǒng)數(shù)據(jù)庫的分區(qū)方式:就oracle而言,分區(qū)獨立存在于段里,里面存儲真實的數(shù)據(jù),在數(shù)據(jù)進行插入的時候自動分配分區(qū)。

Hive的分區(qū)方式:由于Hive實際是存儲在HDFS上的抽象,Hive的一個分區(qū)名對應一個目錄名,子分區(qū)名就是子目錄名,并不是一個實際字段。

所以可以這樣理解,當我們在插入數(shù)據(jù)的時候指定分區(qū),其實就是新建一個目錄或者子目錄,或者在原有的目錄上添加數(shù)據(jù)文件。

Hive分區(qū)的創(chuàng)建

Hive分區(qū)是在創(chuàng)建表的時候用Partitioned by 關鍵字定義的,但要注意,Partitioned by子句中定義的列是表中正式的列,但是Hive下的數(shù)據(jù)文件中并不包含這些列,因為它們是目錄名。

靜態(tài)分區(qū)

創(chuàng)建一張靜態(tài)分區(qū)表par_tab,單個分區(qū)

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)

準備本地數(shù)據(jù)文件par_tab.txt,內容 “名字/國籍”,將以性別(sex)作為分區(qū)

jan,china
mary,america
lilei,china
heyong,china
yiku,japan
emoji,japan

把數(shù)據(jù)插入到表(其實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

可以看到,在新建分區(qū)表的時候,系統(tǒng)會在hive數(shù)據(jù)倉庫默認路徑/user/hive/warehouse/下創(chuàng)建一個目錄(表名),再創(chuàng)建目錄的子目錄sex=man(分區(qū)名),最后在分區(qū)名下存放實際的數(shù)據(jù)文件。

如果再插入另一個數(shù)據(jù)文件數(shù)據(jù),如文件

lily,china
nancy,china
hanmeimei,america

插入數(shù)據(jù)

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)

因為分區(qū)列是表實際定義的列,所以查詢分區(qū)數(shù)據(jù)時

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)

下面創(chuàng)建一張靜態(tài)分區(qū)表par_tab_muilt,多個分區(qū)(性別+日期)

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

可見,新建表的時候定義的分區(qū)順序,決定了文件目錄順序(誰是父目錄誰是子目錄),正因為有了這個層級關系,當我們查詢所有man的時候,man以下的所有日期下的數(shù)據(jù)都會被查出來。如果只查詢日期分區(qū),但父目錄sex=man和sex=woman都有該日期的數(shù)據(jù),那么Hive會對輸入路徑進行修剪,從而只掃描日期分區(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)自己選擇。

首先,啟動動態(tài)分區(qū)功能

hive> set hive.exec.dynamic.partition=true;

假設已有一張表par_tab,前兩列是名稱name和國籍nation,后兩列是分區(qū)列,性別sex和日期dt,數(shù)據(jù)如下

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)

現(xiàn)在我把這張表的內容直接插入到另一張表par_dnm中,并實現(xiàn)sex為靜態(tài)分區(qū),dt動態(tài)分區(qū)(不指定到底是哪日,讓系統(tǒng)自己分配決定)

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

再查看分區(qū)數(shù)

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)

證明動態(tài)分區(qū)成功。

注意,動態(tài)分區(qū)不允許主分區(qū)采用動態(tài)列而副分區(qū)采用靜態(tài)列,這樣將導致所有的主分區(qū)都要創(chuàng)建副分區(qū)靜態(tài)列所定義的分區(qū)。

動態(tài)分區(qū)可以允許所有的分區(qū)列都是動態(tài)分區(qū)列,但是要首先設置一個參數(shù)hive.exec.dynamic.partition.mode :

hive> set hive.exec.dynamic.partition.mode;
hive.exec.dynamic.partition.mode=strict

它的默認值是strick,即不允許分區(qū)列全部是動態(tài)的,這是為了防止用戶有可能原意是只在子分區(qū)內進行動態(tài)建分區(qū),但是由于疏忽忘記為主分區(qū)列指定值了,這將導致一個dml語句在短時間內創(chuàng)建大量的新的分區(qū)(對應大量新的文件夾),對系統(tǒng)性能帶來影響。
所以我們要設置:

hive> set hive.exec.dynamic.partition.mode=nostrick;

到此,相信大家對“如何創(chuàng)建Hive分區(qū)”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

網(wǎng)站欄目:如何創(chuàng)建Hive分區(qū)
轉載來源:http://chinadenli.net/article4/ppcdoe.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航靜態(tài)網(wǎng)站軟件開發(fā)電子商務全網(wǎng)營銷推廣企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設