背景
產品要我更新乙個月以前的增量資料(每天乙個分割槽,累計起來的)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和空間資訊網格三部分。第一部分,是很最重要的,也是最實在的,最具有挑戰性的,第二部分,其實就是吹牛,第三部分,也是很重要的,主要是...
告別了一段時間
時間長了就想寫這篇文章!其實,這是不是真的文章,依靠的就是自己乙個警鐘。或者提示。不得不踏上了六個月的旅程再次考研,去年考研的三個月。加上考研之後的一段時間去找學校調劑,找工作去實習,總感覺跟自己的想法漸行漸遠,這裡鄭重宣告 不是說找工作不好。就是本人比較喜歡玩一些有意思的東西,可能就不是非常喜歡去...