Hive(七)分區(qū)表和分桶表

分區(qū)表

分區(qū)表實際上就是對應(yīng)一個HDFS文件系統(tǒng)上的獨立的文件夾讶舰,該文件夾下是該分區(qū)所有的數(shù)據(jù)文件。\color{red}{Hive中的分區(qū)就是分目錄}翠储,把一個大的數(shù)據(jù)集根據(jù)業(yè)務(wù)需要分割成小的數(shù)據(jù)集绘雁。在查詢時通過WHERE子句中的表達(dá)式選擇查詢所需要的指定的分區(qū),這樣的查詢效率會提高很多援所。

分區(qū)表基本操作

  1. 引入分區(qū)表(需要根據(jù)日期對日志進(jìn)行管理, 通過部門信息模擬)
    準(zhǔn)備三份日志文件
    log_2020-01-01.log
張三  男   18
李四  女   20
王二  男   34

log_2020-01-02.log

二狗子 男   28
張大貴人    男   23
小李子 男   23
王瘋子 女   78

log_2020-01-03.log

白雪公主    女   18
青蛙王子    男   24
巫師  女   67
大娃  男   8

注意:上面數(shù)據(jù)雖然看起來亂亂的庐舟,但是都是按照\t進(jìn)行分割的。

  1. 創(chuàng)建分區(qū)表
hive (default)> create table log_partition(name string,gender string,age int) 
partitioned by (day string) row format delimited fields terminated by '\t';
OK
Time taken: 1.32 seconds
  1. 加載數(shù)據(jù)到分區(qū)表
    1)分區(qū)準(zhǔn)備
[admin@hadoop102 partition_table]$ ll
總用量 12
-rw-rw-r--. 1 admin admin 42 5月  27 20:58 log_2020-01-01.log
-rw-rw-r--. 1 admin admin 71 5月  27 21:00 log_2020-01-02.log
-rw-rw-r--. 1 admin admin 67 5月  27 21:01 log_2020-01-03.log

?2)加載數(shù)據(jù)
?語法: load data [local] inpath <文件地址> into table <分區(qū)表名> partition(<分區(qū)字段>=<分區(qū)名稱>);
?說明:
??local:可選項住拭,若不設(shè)置<文件地址>將需要是HDFS上的地址挪略,若設(shè)置了local 表示從本地進(jìn)行加載·。
??<文件地址>:與是否配置 local 有關(guān)滔岳,配置了local設(shè)置本地路徑(如Linux地址)杠娱,不配置就從HDFS上找。
??<分區(qū)表名>:創(chuàng)建分區(qū)表的那個名稱
??<分區(qū)字段>:創(chuàng)建分區(qū)表時指定的分區(qū)字段(day)谱煤,分區(qū)字段可以配置多個摊求,表示多級目錄。
??<分區(qū)名稱>:可以隨便指定刘离,即使與之前面的相同也無所謂室叉。用于存放文件中的數(shù)據(jù)。


? - 加載 log_2020-01-01.log 數(shù)據(jù)

hive (default)> load data local inpath '/home/admin/partition_table/log_2020-01-01.log' into table  log_partition partition(day='20200101');
Loading data to table default.log_partition partition (day=20200101)
OK
Time taken: 2.009 seconds
hive (default)> 

? - 加載 log_2020-01-02.log 數(shù)據(jù)

hive (default)> load data local inpath '/home/admin/partition_table/log_2020-01-02.log' into table  log_partition partition(day='20200102');
Loading data to table default.log_partition partition (day=20200102)
OK
Time taken: 0.564 seconds

? - 加載 log_2020-01-03.log 數(shù)據(jù)

hive (default)> load data local inpath '/home/admin/partition_table/log_2020-01-03.log' into table  log_partition partition(day='20200103');
Loading data to table default.log_partition partition (day=20200103)
OK
Time taken: 0.437 seconds
數(shù)據(jù)加載結(jié)果

  1. 查詢分區(qū)表中數(shù)據(jù)
  • 查看分區(qū)表信息
hive (default)> desc log_partition;
OK
col_name    data_type   comment
name                    string                                      
gender                  string                                      
age                     int                                         
day                     string                                      
         
# Partition Information      
# col_name              data_type               comment             
day                     string                                      
Time taken: 0.141 seconds, Fetched: 8 row(s)

col_name :常規(guī)字段
data_type:數(shù)據(jù)類型
comment:注釋硫惕。
# Partition Information : 表示分區(qū)信息茧痕,
# col_name: 分區(qū)字段
data_type: 數(shù)據(jù)類型
comment:注釋
day string # 分區(qū)字段名

  • 查詢單個分區(qū)信息
hive (default)> select * from log_partition where day='20200101';
OK
log_partition.name  log_partition.gender    log_partition.age   log_partition.day
張三  男   18  20200101
李四  女   20  20200101
王二  男   34  20200101
  • 也可以查詢多個分區(qū)信息
select * from log_partition where day='20200101' 
union 
select * from log_partition where day='20200102';

由于該方式查詢需要運行ResourceManager,這里就就直接展示結(jié)果吧

Total MapReduce CPU Time Spent: 4 seconds 80 msec
OK
_u1.name    _u1.gender  _u1.age _u1.day
二狗子 男   28  20200102
小李子 男   23  20200102
張三  男   18  20200101
張大貴人    男   23  20200102
李四  女   20  20200101
王二  男   34  20200101
王瘋子 女   78  20200102
Time taken: 22.96 seconds, Fetched: 4 row(s)

注意:千萬不要寫成 select * from log_partition where day='20200101' and '20200102'恼除;沒有為什么踪旷,可能不支持,已躺雷豁辉。

  1. 查看分區(qū)表有多少分區(qū)
    語法:show partitions <分區(qū)表>
hive (default)> show partitions log_partition;
OK
partition
day=20200101
day=20200102
day=20200103
Time taken: 0.068 seconds, Fetched: 3 row(s)
  1. 添加分區(qū)
  • 創(chuàng)建單個分區(qū)
    案例:在log_partition分區(qū)表中添加 2020104 分區(qū)
hive (default)> alter table log_partition add partition(day='2020104');
OK
Time taken: 0.093 seconds
創(chuàng)建單個分區(qū)結(jié)果查看

-創(chuàng)建多個分區(qū)
案例:在log_partition分區(qū)表中添加 20200105 和 20200106 分區(qū)

hive (default)> alter table log_partition add partition(day='20200105') partition(day='20200106');
OK
Time taken: 0.091 seconds

語法:alter table <分區(qū)表> add partition(分區(qū)字段=分區(qū)值) partition(分區(qū)字段=分區(qū)值) ...;
總結(jié):添加多個分區(qū)令野,需要指定指定多個partition(),每個partition 使用空格分隔徽级。

  1. 刪除分區(qū)
  • 刪除單個分區(qū)
    語法:alter table <表名> drop partition ()
hive (default)> alter table dept_partition drop partition (day='20200406');
  • 同時刪除多個分區(qū)(分區(qū)之間必須有逗號)
    語法:alter table <表名> drop partition (),partition (),partition ()...;
hive (default)> alter table dept_partition drop partition(day='2020041'),partition(day='20200402');
  1. 查看分區(qū)表結(jié)構(gòu)
    語法:desc [fromatted] <table> ;
hive (default)> desc formatted dept_partition;
OK
col_name    data_type   comment
# col_name              data_type               comment             
deptno                  int                                         
dname                   string                                      
loc                     string                                      
         
# Partition Information      
# col_name              data_type               comment             
day                     string          
...
...                         

分區(qū)表二級分區(qū)

所謂的二級分區(qū)彩掐,就是在分區(qū)中在嵌套一個分區(qū),簡單點描述就是目錄嵌套目錄灰追。當(dāng)然不止能創(chuàng)建二級分區(qū)堵幽,根據(jù)業(yè)務(wù)需求狗超,三級四級也是可以的。對于表來說朴下,分區(qū)就是一個字段努咐。以下案例數(shù)據(jù)過于敏感,并不會展示查詢結(jié)果殴胧。

  1. 創(chuàng)建二級分區(qū)表
create table zhenai(name string,resume string,hometown string,marriage string,age string,height string) partitioned by (day string,hour string)  
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS TEXTFILE;

ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS TEXTFILE
\color{red}{用于加載 json格式的數(shù)據(jù)}
參考網(wǎng)站:https://www.cnblogs.com/lhicp/p/14033516.html

  1. 加載數(shù)據(jù)到分區(qū)表中
    1.從hdfs中進(jìn)行加載
hive (default)> load data inpath '/flume/zhenai/20210603/14' into table zhenai partition(day='20210603',hour='14');

?2.查詢分區(qū)數(shù)據(jù)數(shù)據(jù)過于銘感渗稍,就不展示了

hive (default)> select * from zhenai where day='20210603' and hour='12';
  1. 把數(shù)據(jù)直接上傳到分區(qū)目錄上,讓分區(qū)表和數(shù)據(jù)產(chǎn)生關(guān)聯(lián)的三種方式
  • 方式一:上傳數(shù)據(jù)后修復(fù)
    1.創(chuàng)建一個分區(qū)目錄(day=20210603,hour=15)
    hive (default)> dfs -mkdir -p /user/hive/warehouse/zhenai/day=20210603/hour=15;
    
    2.將最近的一批數(shù)據(jù)復(fù)制到hour=15目錄下
    hive (default)> dfs -mv /flume/zhenai/20210603/15/1522706220328.json  /user/hive/warehouse/zhenai/day=20210603/hour=15;
    
    此時查詢是無法查詢到數(shù)據(jù)的
    &emsp;hive (default)> select * from zhenai where day='20210603'  and hour='15';
    OK
    zhenai.name   zhenai.resume   zhenai.hometown zhenai.marriage zhenai.age    zhenai.height zhenai.day  zhenai.hour
    Time taken: 0.094 seconds
    
    1. 執(zhí)行修復(fù)命令
      語法:msck repair table <分區(qū)表>
    hive (default)>  msck repair table zhenai;
    OK
    Partitions not in metastore:  zhenai:day=20210603/hour=15
    Repair: Added partition to metastore zhenai:day=20210603/hour=15
    Time taken: 0.085 seconds, Fetched: 2 row(s)
    
    再次查詢就有數(shù)據(jù)了
    hive (default)> select * from zhenai where hour='15';
    OK
    zhenai.name   zhenai.resume   zhenai.hometown zhenai.marriage zhenai.age    zhenai.height zhenai.day  zhenai.hour
    # 表數(shù)據(jù)在這展示团滥,數(shù)據(jù)敏感竿屹,不做展示
    
  • 方式二:上傳數(shù)據(jù)后添加分區(qū)
    1. 創(chuàng)建一個分區(qū)目錄 (day=20210603,hour=16)
    hive (default)> dfs -mkdir -p /user/hive/warehouse/zhenai/day=20210603/hour=16;
    
    2 . 導(dǎo)入數(shù)據(jù)
    hive (default)> dfs -cp /flume/zhenai/20210603/15/1622706220328.json   /user/hive/warehouse/zhenai/day=20210603/hour=
    
    1. 添加分區(qū)
    hive (default)> alter table zhenai add partition (day='20210603',hour='16');
    
    1. 數(shù)據(jù)查詢
    hive (default)> select * from zhenai where day='20210603' and hour='16';
    OK
    zhenai.name   zhenai.resume   zhenai.hometown zhenai.marriage zhenai.age    zhenai.height zhenai.day  zhenai.hour
    # 表數(shù)據(jù)在這展示,數(shù)據(jù)敏感灸姊,不做展示
    
  • 方式三:創(chuàng)建文件夾后load數(shù)據(jù)到分區(qū)
    1. 創(chuàng)建一個分區(qū)目錄 (day=20210603,hour=17)
    hive (default)> dfs -mkdir -p /user/hive/warehouse/zhenai/day=20210603/hour=17;
    
    1. 上傳數(shù)據(jù)
    hive (default)> load data inpath '/flume/zhenai/20210603/16/1622707379156.json' into table zhenai partition(day='20210603',hour='17');
    
    1. 查詢數(shù)據(jù)
    hive (default)> select * from zhenai where day='20210603' and hour='17';
    OK
    zhenai.name   zhenai.resume   zhenai.hometown zhenai.marriage zhenai.age    zhenai.height zhenai.day  zhenai.hour
    # 表數(shù)據(jù)在這展示拱燃,數(shù)據(jù)敏感,不做展示
    

  1. 動態(tài)分區(qū)調(diào)整

關(guān)系型數(shù)據(jù)庫中力惯,對分區(qū)表Insert數(shù)據(jù)時候碗誉,數(shù)據(jù)庫自動會根據(jù)分區(qū)字段的值,將數(shù)據(jù)插入到相應(yīng)的分區(qū)中父晶,Hive中也提供了類似的機(jī)制哮缺,即動態(tài)分區(qū)(Dynamic Partition),只不過甲喝,使用Hive的動態(tài)分區(qū)尝苇,需要進(jìn)行相應(yīng)的配置。

開啟動態(tài)分區(qū)參數(shù)設(shè)置

  1. 開啟動態(tài)分區(qū)功能(默認(rèn)true埠胖,開啟)
hive.exec.dynamic.partition=true
  1. 設(shè)置為非嚴(yán)格模式(動態(tài)分區(qū)的模式糠溜,默認(rèn)strict,表示必須指定至少一個分區(qū)為靜態(tài)分區(qū)押袍,nonstrict模式表示允許所有的分區(qū)字段都可以使用動態(tài)分區(qū)。)
hive.exec.dynamic.partition.mode=nonstrict
  1. 在所有執(zhí)行MR的節(jié)點上凯肋,最大一共可以創(chuàng)建多少個動態(tài)分區(qū)谊惭。默認(rèn)1000
hive.exec.max.dynamic.partitions=1000
  1. 在每個執(zhí)行MR的節(jié)點上,最大可以創(chuàng)建多少個動態(tài)分區(qū)侮东。該參數(shù)需要根據(jù)實際的數(shù)據(jù)來設(shè)定圈盔。比如:源數(shù)據(jù)中包含了一年的數(shù)據(jù),即day字段有365個值悄雅,那么該參數(shù)就需要設(shè)置成大于365驱敲,如果使用默認(rèn)值100,則會報錯宽闲。
hive.exec.max.dynamic.partitions.pernode=100
  1. 整個MR Job中众眨,最大可以創(chuàng)建多少個HDFS文件握牧。默認(rèn)100000
hive.exec.max.created.files=100000
  1. 當(dāng)有空分區(qū)生成時,是否拋出異常娩梨。一般不需要設(shè)置沿腰。默認(rèn)false
hive.error.on.empty.partition=false

分桶表

  1. 概述

分區(qū)提供一個隔離數(shù)據(jù)和優(yōu)化查詢的便利方式。不過狈定,并非所有的數(shù)據(jù)集都可形成合理的分區(qū)颂龙。對于一張表或者分區(qū),Hive 可以進(jìn)一步組織成桶纽什,也就是更為細(xì)粒度的數(shù)據(jù)范圍劃分措嵌。

分桶是將數(shù)據(jù)集分解成更容易管理的若干部分的另一個技術(shù)。
分區(qū)針對的是數(shù)據(jù)的存儲路徑芦缰;分桶針對的是數(shù)據(jù)文件企巢。

  1. 語法

create table <表名>(id int, name string)
clustered by(id) # 指定按什么字段進(jìn)行分桶
into 4 buckets # 共分為幾個桶
row format delimited fields terminated by '\t'; # 指定切割符

分桶抽樣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饺藤,隨后出現(xiàn)的幾起案子包斑,更是在濱河造成了極大的恐慌,老刑警劉巖涕俗,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罗丰,死亡現(xiàn)場離奇詭異,居然都是意外死亡再姑,警方通過查閱死者的電腦和手機(jī)萌抵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來元镀,“玉大人绍填,你說我怎么就攤上這事∑芤桑” “怎么了讨永?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遇革。 經(jīng)常有香客問我卿闹,道長,這世上最難降的妖魔是什么萝快? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任锻霎,我火速辦了婚禮,結(jié)果婚禮上揪漩,老公的妹妹穿的比我還像新娘旋恼。我一直安慰自己,他們只是感情好奄容,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布冰更。 她就那樣靜靜地躺著产徊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冬殃。 梳的紋絲不亂的頭發(fā)上囚痴,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機(jī)與錄音审葬,去河邊找鬼深滚。 笑死,一個胖子當(dāng)著我的面吹牛涣觉,可吹牛的內(nèi)容都是我干的痴荐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼官册,長吁一口氣:“原來是場噩夢啊……” “哼生兆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起膝宁,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤鸦难,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后员淫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體合蔽,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年介返,在試婚紗的時候發(fā)現(xiàn)自己被綠了拴事。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡圣蝎,死狀恐怖刃宵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情徘公,我是刑警寧澤牲证,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站关面,受9級特大地震影響坦袍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缭裆,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一键闺、第九天 我趴在偏房一處隱蔽的房頂上張望寿烟。 院中可真熱鬧澈驼,春花似錦、人聲如沸筛武。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至内边,卻和暖如春榴都,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漠其。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工嘴高, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人和屎。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓拴驮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柴信。 傳聞我的和親對象是個殘疾皇子套啤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容