Hive分割槽表,動態分割槽,分桶表

2021-10-08 10:04:40 字數 3191 閱讀 3396

分割槽針對的是資料的儲存路徑;分桶針對的是資料檔案

(對已經分好類的檔案匯入靜態分割槽)

create table  tb_p_order(

oid int ,

dt string ,

cost double

)partitioned by (mot string,day string)

row format delimited fields terminated by "," ;

例項:建立乙個二級靜態分割槽

匯入資料:

load data local inpath "/opt2/06-18.txt" into table tb_p_order partition(mot='06',day='18');
06-18.txt

01,2020-06-18,200

02,2020-06-18,200

03,2020-06-18,100

03,2020-06-18,200

04,2020-06-18,200

05,2020-06-18,20

06,2020-06-18,100

07,2020-06-18,200

08,2020-06-18,200

09,2020-06-18,100

10,2020-06-18,200

檢視效果:分到不同的資料夾下管理,二級分割槽就是二級資料夾,通過分割槽字段檢查查詢時間

根據查詢的已存在hive中的資料的某個屬性進行分割槽 ,就是動態分割槽。查詢後動態匯入建好的分割槽表

1,開啟動態分割槽功能:

set hive.exec.dynamic.partition=true ;

set hive.exec.dynamic.partition.mode=nonstrick; 可以從普通表中匯入資料

2,建立分割槽表:(和普通分割槽表建立沒區別)

create  table  if not exists  tb_p_user(

uid string ,

name string ,

age int ,

gender string ,

address string

)partitioned by (addr string)

row format delimited fields terminated by " " ;

3,動態的從其他表中匯入資料

插入資料的時候兩張表字段型別個數一一對應。  最後乙個字段就是分割槽字段 (其中tb_user就是普通表)

insert into tb_p_user partition(addr)

select uid , name , age , gender , address , address from tb_user ;

4,動態分割槽相關的設定引數

set hive.exec.dynamic.partition=true //使用動態分割槽

set hive.exec.dynamic.partition.mode=nonstrick;//無限制模式,如果模式是strict,則必須有乙個靜態分割槽且放在最前面

set hive.exec.max.dynamic.partitions.pernode=10000;//每個節點生成動態分割槽的最大個數

set hive.exec.max.dynamic.partitions=100000;//生成動態分割槽的最大個數

set hive.exec.max.created.files=150000;//乙個任務最多可以建立的檔案數目

set dfs.datanode.max.xcievers=8192;//限定一次最多開啟的檔案數

set hive.merge.mapfiles=true; //map端的結果進行合併

set mapred.reduce.tasks =20000; //設定reduce task個數

好處:1,更快,桶為表加上額外結構,連線相同列劃分了桶的表,可以使用map-side join更加高效。(相當於mr的分割槽)

2,取樣sampling更高效。沒有分割槽的話需要掃瞄整個資料集。

建立分桶表:

1,開啟分桶

set hive.enforce.bucketing=true;
2,建立分桶表,例項根據id分桶,分成四份

create table buck_demo(id int, name string)

clustered by(id) into 4 buckets;

3,測試,動態的從其他表中匯入資料

insert into table buck_demo

select id, name from stu;

4,檢視結果:匯入的資料被分成四份

5,抽樣資料:示例:拿出其中第二份

select * from  buck_demo tablesample(bucket 2 out of 4 on id);
注:tablesample是抽樣語句,語法:tablesample(bucket x out of y) 。

y必須是table總bucket數的倍數或者因子。hive根據y的大小,決定抽樣的比例。例如,table總共分了4份,當y=2時,抽取(4/2=)2個bucket的資料,當y=8時,抽取(4/8=)1/2個bucket的資料。

x表示從哪個bucket開始抽取,如果需要取多個分割槽,以後的分割槽號為當前分割槽號加上y。例如,table總bucket數為4,tablesample(bucket 1 out of 2),表示總共抽取(4/2=)2個bucket的資料,抽取第1(x)個和第3(x+y)個bucket的資料。

hive表型別 桶表 分割槽表

hive表型別 桶表 桶表是對資料進行雜湊取值,然後放到不同檔案中儲存。建立表create table t bucket id string clustered by id into 3 buckets 載入資料 set hive.enforce.bucketing true insert into...

HIVE 表 分割槽表 分桶表

hive中表 1.managed table 託管表。刪除表時,資料也刪除了。2.external table 外部表。刪除表時,資料不刪。hive命令 建立表,external 外部表 hive create external table if not exists t2 id int,name ...

hive 動態分割槽表

注意 1 並不是都要建輔助表,因為是用load的方式載入資料,所以才要建 2 select 的時候,分割槽欄位要寫在最後面 使用動態分割槽表必須配置的引數 設定為true允許使用dynamic partition hive.exec.dynamic.partition 預設false 設定dynam...