文章目錄
-
- 一、hive分區概念(partition)
-
- 1.hive的概念
- 2.hive分區
- 3.分區的作用
- 二、靜态分區與動态分區的文法
-
- 1.原檔案
- 2.建立分區表文法
- 3.靜态分區操作:增加或删除分區文法
- 4.靜态分區引入資料
- 5.動态分區文法
- 三、靜态分區和動态分區的差別及應用場景
-
- 1.靜态分區和動态分區的差別
- 2.靜态分區和動态分區的應用場景
一、hive分區概念(partition)
1.hive的概念
hive 是基于Hadoop的一個資料倉庫工具,底層存儲是基于 HDFS 進行存儲,Hive 的計算底層是轉換成 MapReduce任務進行計算,hive可以将結構化的資料檔案映射為一張資料庫表,并提供SQL查詢功能。
簡單來講,①hive并不存儲資料 ②提供類sql文法對檔案進行操作
2.hive分區
hive分區表實際上就是對應一個 HDFS 檔案系統上的獨立的檔案夾,該檔案夾下是該分區所有的資料檔案。Hive 中的分區就是分目錄,把一個大的資料集根據業務需要分割成小的資料集。在查詢時通過 WHERE 子句中的表達式選擇查詢所需要的指定的分區,這樣的查詢效率會提高很多。
即表中的一個分區對應于表下的一個目錄,所有的分區的資料都存儲在對應的目錄中。
例如:總表(使用者表)為一個檔案夾根據性别分區,那麼性别為男生成一個檔案夾,性别為女生成一個檔案夾,每個檔案夾中存儲相應資料。
3.分區的作用
分區主要用于提高性能
①分區列的值将表劃分為一個個的檔案夾
②查詢時文法使用"分區"列和正常列類似
例如:
select * from userinfo where sex ='男';
③查詢時Hive會隻從指定分區查詢資料,提高查詢效率
二、靜态分區與動态分區的文法
1.原檔案
2.建立分區表文法
注意:分區的列最好不要與建表的列相同
year 為一級分區,month為二級分區
create table if not exists employee_partitioned (
`name` string,
`employee_id` int,
`number` string)
partitioned by (
`year` int,
`month` int)
row format delimited fields terminated by '|'
stored as textfile;
3.靜态分區操作:增加或删除分區文法
-- 建立分區
//單個分區建立
alter table employee_partitioned add partition(year='2019',month='6') ;
//多個分區建立
alter table employee_partitioned add partition(year='2020',month='6') partition(year='2020',month='7');
-- 删除分區
//單個分區删除
alter table employee_partitioned drop partition (year='2019',month='6');
//多個分區删除
alter table employee_partitioned partition (year='2020','month=6'), partition (year='2020',month='7');
4.靜态分區引入資料
①load
local inpath 為本地檔案路徑 ,隻有inpath 表示hdfs檔案路徑 ,将路徑中的檔案傳到2020年6月的檔案夾中,預設傳入該路徑的資料增加year=2020,month=6 兩個字段,也可以将year=2020,month=6 了解為一種标簽,原資料并沒有發生改變,在查詢2020年6月的資料時,就将該檔案的資料展示出來
一般将已确認分區的資料傳入相應的檔案夾中
②insert(常用)
insert into 将資料添加到表中
insert overwrite 會覆寫表中已有的資料
//将本地檔案傳入hdfs中
Hadoop dfs -put /data/employee_hr.txt /tmp/employee
//将檔案映射為相應的表
create table if not exists employee_hr(
name string,
employee_id int,
number string,
start_date date)
row format delimited fields terminated by '|'
location '/data/employee_hr.txt';
//根據查詢所得的結果傳入相應的檔案夾中
insert overwrite table employee_partitioned partition(year=2020,month=8)
select name,employee_id,number from employee_hr where year(start_date)=2020 and month(start_date)=8;
5.動态分區文法
①設定屬性,打開自動分區,并設定分區模式為非嚴格模式
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
②動态分區建表語句與靜态分區相同,這邊就直接使用employee_partitioned表
③動态分區插入資料
根據檔案内容,自動分區
insert into employee_partitioned
partition(year,month)
select name,employee_id,number,year(start_date),month(start_date)
from employee_hr;
三、靜态分區和動态分區的差別及應用場景
1.靜态分區和動态分區的差別
靜态分區
①靜态分區是在編譯期間指定的指定分區名
②支援load和insert兩種插入方式
load方式
會将分區字段的值全部修改為指定的内容
一般是确定該分區内容是一緻的時候才會使用
insert方式
必須先将資料放在一個沒有設定分區的普通表中
該方式可以在一個分區記憶體儲一個範圍的内容
從普通表中選出的字段不能包含分區字段
③适用于分區數少,分區名可以明确的資料
動态分區
①根據分區字段的實際值,動态進行分區
②是在sql執行的時候進行分區
③需要先将動态分區設定打開
④隻能用insert方式
⑤通過普通表選出的字段包含分區字段,分區字段放置在最後,多個分區字段按照分區順序放置
2.靜态分區和動态分區的應用場景
靜态分區:适合已經确認分區的檔案,分區相對較少的,适合增量導入的應用場景
動态分區:适合根據時間線做分區,分區比較多的,适合全量導入的場景