高效辨別Hive的靜態和動態分割槽

2021-10-04 01:50:24 字數 2609 閱讀 6064

1、hive中有分割槽表的概念,我們可以看到分割槽具有重要效能優勢,分割槽表可以將資料以一種符合邏輯的方式進行組織,比如分層儲存。

2、查詢分割槽表中的資料時,除非where語句中包含分割槽字段過濾條件來顯示資料範圍,否則不允許執行。

3、換句話說,就是使用者不允許掃瞄所有的分割槽。

4、進行這個顯示的原因是,通常分割槽表都擁有非常大的資料集,而且資料增加迅速。如果沒有進行分割槽限制的查詢可能會消耗令人不可接受的巨大資源來處理這個表。

5、分割槽是hive存放資料的一種方式。將列值作為目錄來存放資料,就是乙個分割槽。這樣查詢時使用分割槽列進行過濾,只需根據列值直接掃瞄對應目錄下的資料,不掃瞄其他不關心的分割槽,快速定位,提高查詢效率。

靜態分割槽是手動指定的。

動態分割槽是通過資料來進行判斷。

靜態分割槽的列是在編譯時期,通過使用者傳遞列名來決定。

動態分割槽是在sql執行的時候來確定的。

靜態分割槽:

若分割槽的值是確定的,那麼稱為靜態分割槽。新增分割槽或者是載入分割槽資料時,已經指定分割槽名。

create table test

(name string,age int)

partitioned by (country string)

row format delimited fields terminated by '\t'

lines terminated by '\n'

stored as textfile;

insert into table test partition(country="china"

)values(

"zhangsan"

,1);

insert into table test partition(country="usa"

)values(

"james"

,34)

;insert into table test partition(country="usa"

)values(

"tom"

,2);

select

*from test where country="china"

;

alter table test drop partition(country="china"

);

load data local inpath '/root/desktop/student.txt' into table test partition(name='zs'

,age=21)

;

動態分割槽:

分割槽的值是非確定的,由輸入資料來確定.

動態分割槽的相關屬性:

set hive.exec.dynamic.partition=true;

(可通過這個語句檢視:

set hive.exec.dynamic.partition;

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

set hive.exec.max.dynamic.partitions=100000;

(如果自動分割槽數

大於這個引數,將會報錯)

set hive.exec.max.dynamic.partitions.pernode=100000;

show partitions order_part;
select

*from user_trade limit 6;這樣會報錯,因為沒有加分割槽條

件。

set hive.mapred.mode=strict;

select

*from user_trade limit 6;

select

*from user_trade where dt='2017-01-12'

;

分割槽時注意:

1、盡量不要用動態分割槽,因為動態分割槽的時候,將會為每乙個分割槽分配reducer數量,當分割槽數量多的時候,reducer數量將會增加,對伺服器是一種災難。

2、動態分割槽和靜態分割槽的區別,靜態分割槽不管有沒有資料都將會建立該分割槽,動態分割槽是有結果集將建立,否則不建立。

3、hive動態分割槽的嚴格模式和hive提供的hive.mapred.mode的嚴格模式。

hive提供我們乙個嚴格模式:為了阻止使用者不小心提交惡意hql

hive.mapred.mode=nostrict : strict

如果該模式值為strict,將會阻止以下三種查詢:

1、對分割槽表查詢,where中過濾字段不是分割槽字段。

2、笛卡爾積join查詢,join查詢語句,不帶on條件或者where條件。

3、對order by查詢,有order by的查詢不帶limit語句。

Hive靜態分割槽和動態分割槽

需求 需要建立乙個備份帶分割槽的資料表,拷貝時若採用靜態分割槽方式需要寫n行語句,建議使用動態分割槽,節省大量時間。hive的分割槽方式 由於hive實際是儲存在hdfs上的抽象,hive的乙個分割槽名對應乙個目錄名,子分割槽名就是子目錄名,並不是乙個實際字段。hive中支援兩種型別的分割槽 靜態分...

例項演示hive的靜態分割槽和動態分割槽

分割槽主要用於提高效能 分割槽列的值將表劃分為乙個個的資料夾 查詢時語法使用 分割槽 列和常規列類似 查詢時hive會只從指定分割槽查詢資料,提高查詢效率 注 由於hive實際是儲存在hdfs上的抽象,hive的乙個分割槽名對應乙個目錄名,子分割槽名就是子目錄名,並不是乙個實際字段。所以可以這樣理解...

db2 最大分割槽數 Hive靜態分割槽和動態分割槽

hive分割槽的作用 如果沒有分割槽的存在,那麼每次查詢hive將會進行全表掃瞄。對於小資料量的表來說,全表掃瞄並不會慢到無法忍受,但是對於大資料量來講,比如幾年的資料,每次查詢都要掃瞄幾年的所有資料,除了浪費時間之外,還浪費集群資源。為了改進這一問題,分割槽的價值就體現出來了。對於幾年的資料,在設...