分區(qū)表
分區(qū)表實際上就是對應(yīng)一個HDFS文件系統(tǒng)上的獨立的文件夾讶舰,該文件夾下是該分區(qū)所有的數(shù)據(jù)文件。翠储,把一個大的數(shù)據(jù)集根據(jù)業(yè)務(wù)需要分割成小的數(shù)據(jù)集绘雁。在查詢時通過WHERE子句中的表達(dá)式選擇查詢所需要的指定的分區(qū),這樣的查詢效率會提高很多援所。
分區(qū)表基本操作
-
引入分區(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)行分割的。
- 創(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
-
加載數(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
- 查詢分區(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'
恼除;沒有為什么踪旷,可能不支持,已躺雷豁辉。
-
查看分區(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)
- 添加分區(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ū)
案例:在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 使用空格分隔徽级。
- 刪除分區(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');
-
查看分區(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é)果殴胧。
- 創(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
參考網(wǎng)站:https://www.cnblogs.com/lhicp/p/14033516.html
-
加載數(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';
- 把數(shù)據(jù)直接上傳到分區(qū)目錄上,讓分區(qū)表和數(shù)據(jù)產(chǎn)生關(guān)聯(lián)的三種方式
-
方式一:上傳數(shù)據(jù)后修復(fù)
1.創(chuàng)建一個分區(qū)目錄(day=20210603,hour=15)
2.將最近的一批數(shù)據(jù)復(fù)制到hour=15目錄下hive (default)> dfs -mkdir -p /user/hive/warehouse/zhenai/day=20210603/hour=15;
hive (default)> dfs -mv /flume/zhenai/20210603/15/1522706220328.json /user/hive/warehouse/zhenai/day=20210603/hour=15;
此時查詢是無法查詢到數(shù)據(jù)的
 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
- 執(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ù)敏感竿屹,不做展示
- 執(zhí)行修復(fù)命令
-
方式二:上傳數(shù)據(jù)后添加分區(qū)
- 創(chuàng)建一個分區(qū)目錄 (day=20210603,hour=16)
2 . 導(dǎo)入數(shù)據(jù)hive (default)> dfs -mkdir -p /user/hive/warehouse/zhenai/day=20210603/hour=16;
hive (default)> dfs -cp /flume/zhenai/20210603/15/1622706220328.json /user/hive/warehouse/zhenai/day=20210603/hour=
- 添加分區(qū)
hive (default)> alter table zhenai add partition (day='20210603',hour='16');
- 數(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ū)
- 創(chuàng)建一個分區(qū)目錄 (day=20210603,hour=17)
hive (default)> dfs -mkdir -p /user/hive/warehouse/zhenai/day=20210603/hour=17;
- 上傳數(shù)據(jù)
hive (default)> load data inpath '/flume/zhenai/20210603/16/1622707379156.json' into table zhenai partition(day='20210603',hour='17');
- 查詢數(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ù)敏感,不做展示
- 動態(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è)置
- 開啟動態(tài)分區(qū)功能(默認(rèn)true埠胖,開啟)
hive.exec.dynamic.partition=true
- 設(shè)置為非嚴(yán)格模式(動態(tài)分區(qū)的模式糠溜,默認(rèn)strict,表示必須指定至少一個分區(qū)為靜態(tài)分區(qū)押袍,nonstrict模式表示允許所有的分區(qū)字段都可以使用動態(tài)分區(qū)。)
hive.exec.dynamic.partition.mode=nonstrict
- 在所有執(zhí)行MR的節(jié)點上凯肋,最大一共可以創(chuàng)建多少個動態(tài)分區(qū)谊惭。默認(rèn)1000
hive.exec.max.dynamic.partitions=1000
- 在每個執(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
- 整個MR Job中众眨,最大可以創(chuàng)建多少個HDFS文件握牧。默認(rèn)100000
hive.exec.max.created.files=100000
- 當(dāng)有空分區(qū)生成時,是否拋出異常娩梨。一般不需要設(shè)置沿腰。默認(rèn)false
hive.error.on.empty.partition=false
分桶表
- 概述
分區(qū)提供一個隔離數(shù)據(jù)和優(yōu)化查詢的便利方式。不過狈定,并非所有的數(shù)據(jù)集都可形成合理的分區(qū)颂龙。對于一張表或者分區(qū),Hive 可以進(jìn)一步組織成桶纽什,也就是更為細(xì)粒度的數(shù)據(jù)范圍劃分措嵌。
分桶是將數(shù)據(jù)集分解成更容易管理的若干部分的另一個技術(shù)。
分區(qū)針對的是數(shù)據(jù)的存儲路徑芦缰;分桶針對的是數(shù)據(jù)文件企巢。
- 語法
create table <表名>(id int, name string)
clustered by(id) # 指定按什么字段進(jìn)行分桶
into 4 buckets # 共分為幾個桶
row format delimited fields terminated by '\t'; # 指定切割符