Hive批量刪除一段時間分割槽 動態分割槽更新資料

2021-10-01 06:43:19 字數 4782 閱讀 4179

背景

產品要我更新乙個月以前的增量資料(每天乙個分割槽,累計起來的)mmp 寫個迴圈指令碼,重新跑。。。

#!/usr/bin/env bash

start_date=

"$1"

end_date=

"$2"

task_job=

"$3"

while

[$ -le $]do

echo

"$" start_date=

`date -d "$ +1 day" +%y%m%d`

done

以上這種方式比較耗時效率低,好在hive有動態分割槽可以解決這個問題

-- 批量刪除分割槽資料

alter

table dm.dm_call_gateway_bill_time_detail drop

partition

(dt >=

"20191101"

,dt <=

'20191130'

)-- 開啟動態分割槽

set hive.

exec

.dynamic.

partition

=true

;--開啟動態分割槽,預設是false

set hive.

exec

.dynamic.

partition

.mode

=nonstrict;

--開啟允許所有分割槽都是動態的,否則必須要有靜態分割槽才能使用

-- 省略了部分表和字段

insert overwrite table dm.dm_call_gateway_bill_time_detail

partition

(dt)

--分割槽字段

select date_format(t.start_time,

'yyyy-mm-dd'

)as p_date,

g.gateway_name,

t.end_time,

-- 以上是表字段

date_format(t.start_time,

'yyyymmdd'

)as dt

--最後乙個欄位為動態分割槽字段

from ods_fdm.fdm_call_transaction t -- 全量表

where t.dt =

'$'and date_format(t.start_time,

'yyyymmdd'

)>=

'20191101'

and date_format(t.start_time,

'yyyymmdd'

)<=

'20191130'

;

要點:因為dm.dm_call_gateway_bill_time_detail表中只有3個字段,所以當我們查詢了4個字段時(多了dt欄位,名字任意),所以系統預設以最後乙個欄位dt為分割槽名,因為分割槽表的分割槽字段預設也是該表中的字段,且依次排在表中字段的最後面。

所以分割槽需要分割槽的字段只能放在最後面,不能把順序弄錯。如果我們查詢5個字段的話,則會報

錯,因為該錶加上分割槽欄位也才4個。要注意系統是根據查詢欄位的位置推斷分割槽名的,而不是欄位名稱。

show partitions  dm.dm_call_gateway_bill_time_detail;

45 dt=

20191101

46 dt=

20191102

47 dt=

20191103..

..73 dt=

20191129

74 dt=

20191130..

.

1.建立乙個只有乙個字段,兩個分割槽欄位的分割槽表

hive (fdm_sor)

>

create

table ds_parttion(id int

)> partitioned by

(state string ,ct string )

;2.往該分割槽表半動態分割槽插入資料

hive>

set hive.

exec

.dynamici.

partition

=true

;set hive.

exec

.dynamic.

partition

.mode

=nonstrict;

insert overwrite table ds_parttion

partition

(state=

'china'

,ct)

#state分割槽為靜態,ct為動態分割槽,以查詢的city欄位為分割槽名

select id ,city from mytest_tmp2_p;

3.查詢結果顯示:

hive (fdm_sor)

>

select

*from ds_parttion where state=

'china'

;ds_parttion.id ds_parttion.state ds_parttion.ct

4 china beijing

3 china beijing

2 china beijing

1 china beijing

4 china beijing1

3 china beijing1

2 china beijing1

1 china beijing1

hive (fdm_sor)

>

select

*from ds_parttion where state=

'china'

and ct=

'beijing'

;ds_parttion.id ds_parttion.state ds_parttion.ct

4 china beijing

3 china beijing

2 china beijing

1 china beijing

hive (fdm_sor)

>

select

*from ds_parttion where state=

'china'

and ct=

'beijing1'

;ds_parttion.id ds_parttion.state ds_parttion.ct

4 china beijing1

3 china beijing1

2 china beijing1

1 china beijing1

time taken: 0.072 seconds, fetched: 4

row(s)

set hive.

exec

.dynamici.

partition

=true

;set hive.

exec

.dynamic.

partition

.mode

=nonstrict;

insert overwrite table ds_parttion

partition

(state,ct)

select id ,country,city from mytest_tmp2_p;

注意:欄位的個數和順序不能弄錯

set hive.

exec

.dynamic.

partition

=true(預設false),表示開啟動態分割槽功能

set hive.

exec

.dynamic.

partition

.mode

= nonstrict(預設strict)

,表示允許所有分割槽都是動態的,否則必須有靜態分割槽字段

set  hive.

exec

.max.dynamic.partitions.pernode=

100 (預設100,一般可以設定大一點,比如1000)

表示每個maper或reducer可以允許建立的最大動態分割槽個數,預設是100,超出則會報錯。

set hive.

exec

.max.dynamic.partitions =

1000

(預設值)

表示乙個動態分割槽語句可以建立的最大動態分割槽個數,超出報錯

set hive.

exec

.max.created.files =

10000

(預設)

全域性可以建立的最大檔案個數,超出報錯。

參考

最近一段時間

嗯。乙個是從那時候開始忙了一段時間,然後就沒有時間寫博,而且那段時間也緊張,還有就是人的劣根性 惰性。從那時候開始,大概過了一周5.30號的進候辭職了,因為拿到了南京一家公司的offer,很快,大概是週三面試,周五面試,周五下午發offer。然後周一去辭職的。一切都是這麼快。其實為什麼決定這麼快,因...

告別一段時間

不談過去。在這個學期,認真的做好兩個地理資訊系統。畢業 不用去管。初步的想法,是空間資料結構和演算法,空間資料探勘和知識發現,smartclient webservice和空間資訊網格三部分。第一部分,是很最重要的,也是最實在的,最具有挑戰性的,第二部分,其實就是吹牛,第三部分,也是很重要的,主要是...

告別了一段時間

時間長了就想寫這篇文章!其實,這是不是真的文章,依靠的就是自己乙個警鐘。或者提示。不得不踏上了六個月的旅程再次考研,去年考研的三個月。加上考研之後的一段時間去找學校調劑,找工作去實習,總感覺跟自己的想法漸行漸遠,這裡鄭重宣告 不是說找工作不好。就是本人比較喜歡玩一些有意思的東西,可能就不是非常喜歡去...