1、介紹
特點: 分區表會在HDFS上產生目錄。查詢數據的時候使用分區字段篩選數據,可以避免全表掃描,從而提升查詢效率
注意: 如果是分區表,在查詢數據的時候,如果沒有使用分區字段,它回去進行全表掃描,會降低效率
只需要記住一點,分區表是用來提升Hive的數據分析效率
2、一級分區
創建分區表: create [external] table [if not exists] 表名稱(字段名稱1 字段數據類型,字段名稱2 字段數據類型..) partitioned by (分區字段 字段數據類型); ? 自動生成分區目錄并插入數據: load data [local] inpath '文件路徑' into table 表名稱 partition (分區字段=值); ? 注意: 如果使用load導入數據,沒有寫local,文件路徑就是HDFS上的路徑。否則就是linux的路徑
示例:
use day06; ? -- 1- 創建分區表 create table one_part_tb(id int,name string,price double,num int ) partitioned by (year int) row format delimited fields terminated by ' '; ? ? -- 2- 通過load將HDFS中的文件導入到Hive表中 load data inpath '/source/order202251.txt' into table one_part_tb partition (year=2022); load data inpath '/source/order202351.txt' into table one_part_tb partition (year=2023); load data inpath '/source/order202352.txt' into table one_part_tb partition (year=2023); load data inpath '/source/order2023415.txt' into table one_part_tb partition (year=2023); ? -- 3- 數據驗證 select * from one_part_tb; ? -- 4- 使用分區 select * from one_part_tb where year=2022; ? -- 5- 如果沒有指定分區,那么會進行全表掃描,拖慢了效率 select * from one_part_tb where price>=20;
3、多級分區
創建分區表: create [external] table [if not exists] 表名稱(字段名稱1 字段數據類型,字段名稱2 字段數據類型..) partitioned by (分區字段1 字段數據類型,分區字段2 字段數據類型...); ? 自動生成分區目錄并插入數據: load data [local] inpath '文件路徑' into table 表名稱 partition (分區字段1=值,分區字段2=值....); ? 注意: 如果使用load導入數據,沒有寫local,文件路徑就是HDFS上的路徑。否則就是linux的路徑
示例:
use day06; ? -- 1- 創建多級分區表 create external table multi_pat_tb(id int,name string,price double,num int ) partitioned by (year string,month string,day string) row format delimited fields terminated by ' '; ? -- 2- 加載HDFS數據到Hive表中 load data inpath '/source/order202251.txt' into table multi_pat_tb partition (year="2022",month="5",day="1"); load data inpath '/source/order202351.txt' into table multi_pat_tb partition (year="2023",month="5",day="1"); load data inpath '/source/order202352.txt' into table multi_pat_tb partition (year="2023",month="5",day="2"); load data inpath '/source/order2023415.txt' into table multi_pat_tb partition (year="2023",month="4",day="15"); ? -- 3- 數據驗證 select * from multi_pat_tb; ? -- 4- 使用分區 -- 注意: 如果是多分區,使用分區來提升效率的時候,需要根據需求來決定到底使用幾個分區。并不需要所有的分區都用到 -- 需求:要對2023全年的銷售情況進行分析 select * from multi_pat_tb where year="2023"; -- 需求:要對2023年5月整個月的銷售情況進行分析 select * from multi_pat_tb where year="2023" and month="5"; select * from multi_pat_tb where year="2023" and month="5" and day="2"; ? -- 5- 不使用分區 select * from multi_pat_tb where price>=20;
4、分區操作
添加分區: alter table 分區表名 add partition (分區字段1=值,分區字段2=值..); ? 刪除分區: alter table 分區表名 drop partition (分區字段1=值,分區字段2=值..); ? 修改分區名: alter table 分區表名 partition (分區字段1=舊分區值,分區字段2=舊分區值..) rename to partition (分區字段1=新分區值,分區字段2=新分區值..); ? 查看所有分區: show partitions 分區表名; ? 同步/修復分區: msck repair table 分區表名; ? 注意: 如果刪除內部表的分區,那么對應的HDFS分區目錄也被刪除了;如果刪除外部表的分區,那么對應的HDFS分區目錄還保留著
示例:
use day06; ? -- 查詢表的分區信息 show partitions one_part_tb; show partitions multi_pat_tb; ? -- 添加分區 alter table one_part_tb add partition (year=2024); -- 如果是多級分區,那么添加分區的時候,需要將所有的分區都添加上 alter table multi_pat_tb add partition (year="2024"); alter table multi_pat_tb add partition (year="2024",month="1",day="1"); ? -- 修改分區 alter table one_part_tb partition (year=2024) rename to partition (year=2000024); ? -- 刪除分區 -- 注意:如果刪除內部表的分區,那么對應的分區目錄也被刪除了;如果刪除外部表的分區,那么對應的HDFS分區目錄還保留著 alter table one_part_tb drop partition (year=2000024); alter table multi_pat_tb drop partition (year="2024",month="1",day="1"); ? -- 修復分區 -- 在執行下面的語句之前,需要手動去/user/hive/warehouse/day06.db/one_part_tb路徑下創建一個year=2025分區目錄 msck repair table one_part_tb;
給多級分區表添加分區遇到的錯誤:
原因: 如果是多級分區,那么添加分區的時候,需要將所有的分區都添加上
修改分區效果: