Hive的分割槽詳解

2021-09-19 14:53:28 字數 4740 閱讀 1940

一、分割槽

hive表就是hdfs的上的乙個目錄

hive表中的資料,其實就是對應了hdfs上的乙個目錄下的資料

概念:對hive表的資料做分割槽管理

建立分割槽表

create table student_ptn(id int, name string) partitioned by (age int, department string) row format delimited fields terminated by 「,」;

新增分割槽

// 新增乙個分割槽

alter table student_ptn add partition(age=44,department=「aa」);

// 一次新增多個分割槽

alter table student_ptn add partition(age=66,department=「cc」) partition(age=55,department=「bb」);

// 新增成功。但是分割槽欄位的順序是在建立分割槽表的時候決定的

alter table student_ptn add partition(department=「dd」,age=77); 

// 新增分割槽時,指定分割槽的資料儲存目錄

alter table student_ptn add partition(age=88,department=「ee」) location 「/ptn_input1」 partition(age=99,department=「ff」) location 「/ptn_input2」;

查詢分割槽

show partitions student_ptn;

修改分割槽

alter table student_ptn partition(age=44,department=「aa」) set location 「hdfs://hadoop02:9000/ptn_input3」;

// 往某個特定的分割槽匯入資料

load data local inpath 「/home/hadoop/student.txt」 into table student_ptn partition(age=55,department=「bb」);

load data local inpath 「/home/hadoop/student.txt」 into table student_ptn;  ***xx  不能直接往分割槽表匯入資料

// 刪除分割槽

alter table student_ptn drop partition(age=44,department=「aa」);  

// 刪除分割槽的時候,包括分割槽的元資料資訊和分割槽的資料及目錄

// 清空分割槽表的時候,分割槽還在,資料被清空

匯入資料,大體上說,總共有三種方式:

1、hadoop fs 

2、load 

3、insert …select…

// 使用insert…values… 的方法是匯入資料,主要用於測試

insert into table student_ptn values (101,「liutao」);

insert into table student_ptn partition(age=66,department=「cc」) values (101,「liutao」);

// 使用單重或者多重模式進去插入

from student

insert … select …

insert … select …

from student 

insert into table student_ptn partition(age=18,department=「a」) select id,name where age = 18 

insert into table student_ptn partition(age=18,department=「b」) select id,name where age = 19;

// 驗證多重分割槽的插入是否成功

select id, name from student_ptn where age = 18 and department  = 「a」;

select id, name from student_ptn where age = 18 and department  = 「b」;

// 動態分割槽

set hive.exec.dynamic.partition = true;

set hive.exec.dynamic.partition.mode = nonstrict;

drop table student_ptn;

insert into table student_ptn partition(age=101, department) select id, department, name from student;     ******

insert into table student_ptn partition(age=202, department) select id, name, department from student;    √√√√√√√

insert into table student_ptn(age) select id, name, age from student;

動態分割槽的效果:

按照動態分割槽的字段的值做劃分,乙個值就是乙個分割槽

該studnet表當中的分割槽欄位department有多少個值,就有多少個分割槽

每個分割槽就存乙個分割槽字段值的所有資料

department = is  cs   ma

二、分桶

概念:對分割槽的進一步的 更細粒度的劃分。 分割槽類似

分桶的核心思想跟 mr程式的預設分割槽元件hashparititioner的原理一致

原理:根據key的hash值去模除以reducetask的個數/mapreduce的分割槽個數/hive表的分桶個數

分桶的原理:對分桶字段的值進行hash,然後模除以桶的個數,得到乙個餘數,該餘數就是分桶的編號000000_0

分桶的效果:

分桶字段的值經過分桶邏輯計算之後得到的餘數相同的都在同乙個分桶檔案中

乙個分桶檔案可能存在分桶字段的多個值

乙個分桶檔案也可能存在沒有任何資料

aa bb cc dd ee

分桶的個數:3

aa=0

bb=1

cc=0

dd=1

ee=0

上面的aa和cc和ee都會出現在第乙個分桶檔案當中

上面的bb和dd都會出現在第二個分桶檔案中

第三個分桶檔案當中就不會出現任何值。

分桶的操作:

建立分桶表:

create table student_bucket (id int, name string, *** string, age int, department string) clustered by (age) sorted by(age desc, id asc) into 2 buckets row format delimited fields terminated by 「,」;

往分桶表匯入資料:

load data local inpath 「/home/hadoop/student.txt」 into table student_bucket;

注意:往分桶表匯入資料,不能使用load方式   ************

insert … values …

insert into table student_bucket values (101,「liuyifei」,「female」,22,「nvshen」);

insert into table student_bucket values (102,「luoyufeng」,「female」,33,「nvdiaosi」);

// insert …values…     ************

// insert into … select…

// ************

insert into table student_bucket select id,name,***,age,department from student;

√√√√√√√√√√√√√√√√√√√√√√√√

//  使用注意:開啟分桶的開關,設定對應的reducetask的個數要跟桶數匹配

set hive.enforce.bucketing = true;

set mapred.reduce.tasks = 2; / set mapreduce.job.reduces = 2;

insert into table student_bucket select id,name,***,age,department from student distribute by age sort by age desc, id asc;

√√√√√√√√√√√√√√√√√√√√√√√√

分桶的特例:

create table student_bucket1 (id int, name string, *** string, age int, department string) clustered by (age) sorted by(age desc) into 2 buckets row format delimited fields terminated by 「,」;

insert into table student_bucket1 select id,name,***,age,department from student distribute by age;    ************x

驗證的問題:最後分桶的資料到底有沒有排序、

hive的分割槽詳解

表分割槽 分割槽列對應目錄 作用 輔助查詢,縮小查詢範圍,加快資料的檢索速度和對資料按照一定的規格和條件進行管理新增分割槽 alter table ods cities add if not exists partition year 2015 month 09 day 01 location us...

Hive分割槽partition詳解

請看原文作者的部落格 我補充的是 外部表的分割槽 create external table t2 id int name string hobby array,add map partitioned by pt d string row format delimited fields termin...

hive 分割槽 hive 分割槽概念 0323

1 hive 分割槽表 在hive select查詢中一般會掃瞄整個表內容,會消耗很多時間做沒必要的工作。有時候只需要掃瞄表中關心的一部分資料,因此建表時引入了partition概念。分割槽表指的是在建立表時指定的partition的分割槽空間。hive可以對資料按照某列或者某些列進行分割槽管理,所...