天天看點

hive分區操作partition——靜态分區和動态分區文法、差別及使用場景

文章目錄

    • 一、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 子句中的表達式選擇查詢所需要的指定的分區,這樣的查詢效率會提高很多。

即表中的一個分區對應于表下的一個目錄,所有的分區的資料都存儲在對應的目錄中。

例如:總表(使用者表)為一個檔案夾根據性别分區,那麼性别為男生成一個檔案夾,性别為女生成一個檔案夾,每個檔案夾中存儲相應資料。

hive分區操作partition——靜态分區和動态分區文法、差別及使用場景

3.分區的作用

分區主要用于提高性能

①分區列的值将表劃分為一個個的檔案夾

②查詢時文法使用"分區"列和正常列類似

例如:

select * from userinfo where sex ='男';

③查詢時Hive會隻從指定分區查詢資料,提高查詢效率

二、靜态分區與動态分區的文法

1.原檔案

hive分區操作partition——靜态分區和動态分區文法、差別及使用場景

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月的資料時,就将該檔案的資料展示出來

一般将已确認分區的資料傳入相應的檔案夾中

hive分區操作partition——靜态分區和動态分區文法、差別及使用場景

②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;

           
hive分區操作partition——靜态分區和動态分區文法、差別及使用場景

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;
           
hive分區操作partition——靜态分區和動态分區文法、差別及使用場景

三、靜态分區和動态分區的差別及應用場景

1.靜态分區和動态分區的差別

靜态分區

①靜态分區是在編譯期間指定的指定分區名

②支援load和insert兩種插入方式

load方式

會将分區字段的值全部修改為指定的内容

一般是确定該分區内容是一緻的時候才會使用

insert方式

必須先将資料放在一個沒有設定分區的普通表中

該方式可以在一個分區記憶體儲一個範圍的内容

從普通表中選出的字段不能包含分區字段

③适用于分區數少,分區名可以明确的資料

動态分區

①根據分區字段的實際值,動态進行分區

②是在sql執行的時候進行分區

③需要先将動态分區設定打開

④隻能用insert方式

⑤通過普通表選出的字段包含分區字段,分區字段放置在最後,多個分區字段按照分區順序放置

2.靜态分區和動态分區的應用場景

靜态分區:适合已經确認分區的檔案,分區相對較少的,适合增量導入的應用場景

動态分區:适合根據時間線做分區,分區比較多的,适合全量導入的場景

繼續閱讀