ps: Maxcompute數(shù)據(jù)倉庫建設(shè)的分享均蜜。
Maxcompute
大致介紹下Maxcompute, Maxcompute是阿里的一個(gè)大數(shù)據(jù)工具宪拥,基于Maxcompute阿里搭建了一個(gè)Datawork的數(shù)據(jù)平臺(tái)潭辈√饭#可以很“方便”的從各種數(shù)據(jù)源導(dǎo)入數(shù)據(jù)坚芜,做數(shù)據(jù)分析、機(jī)器學(xué)習(xí)等谷朝。
“方便"之所以加個(gè)引號(hào)篮灼,是因?yàn)槟承┓矫娴拇_很方便,當(dāng)然業(yè)務(wù)實(shí)在復(fù)雜了徘禁,很多時(shí)候也存在用的很難受的地方。
更多介紹去阿里官網(wǎng)了解吧髓堪。
回到正題送朱,這里主要分享下批量刪除分區(qū)的一個(gè)小技巧娘荡。
分區(qū)
介紹下分區(qū)的概念,Table是一個(gè)數(shù)據(jù)表驶沼,也是一個(gè)分區(qū)的數(shù)組炮沐。分區(qū)把Table的數(shù)據(jù)分成了一個(gè)個(gè)的區(qū)塊。
Maxcompute是個(gè)不支持某條數(shù)據(jù)修改刪除的數(shù)據(jù)倉庫回怜。而分區(qū)是可以刪除和新增的大年。引入分區(qū),就可以做到在小顆粒度上做到修改和刪除的功能玉雾。
背景
首先描述下為何會(huì)有大量的分區(qū)需要?jiǎng)h除的場(chǎng)景翔试。
- 數(shù)據(jù)從datahub歸檔,比如按頻率最高的歸檔方式 15分鐘一次复旬,每次一個(gè)分區(qū)垦缅,可以想象幾個(gè)月后將會(huì)有多少分區(qū)。
- 數(shù)據(jù)從mysql分庫增量讀取驹碍,以每天一次增量壁涎,乘以分庫的數(shù)量,也會(huì)產(chǎn)生大量的分區(qū)志秃。
分區(qū)數(shù)量多了之后怔球,文件將會(huì)變多。一個(gè)是Maxcompute對(duì)于表的分區(qū)是一個(gè)上限數(shù)量浮还,另一個(gè)是分區(qū)數(shù)量多了之后計(jì)算將會(huì)很慢竟坛。
這些源數(shù)據(jù)將會(huì)經(jīng)過清洗產(chǎn)生對(duì)應(yīng)的中間表或者結(jié)果集,供BI或者數(shù)據(jù)分析使用碑定。而源數(shù)據(jù)為了方便管理流码,可以通過sql聚合成一個(gè)大分區(qū)來存放。而原來的很多分區(qū)就可以刪除延刘,以便騰出空間漫试。
方式
一般正常刪除分區(qū)是通過sql來刪除。
alter table 表A drop if EXISTS PARTITION(分區(qū)名='123')
這種方式只能一次刪除一個(gè)分區(qū)碘赖,當(dāng)分區(qū)有上萬個(gè)的時(shí)候就不適用了驾荣。
這種情況可以通過pyodps來輕松的批量刪除分區(qū)。
下面是一個(gè)刪除datahub歸檔分區(qū)的實(shí)例
# 清除歷史分區(qū)普泡,防止分區(qū)數(shù)達(dá)到上限
from datetime import date, timedelta
# 刪除十天前分區(qū)
end_date = date.today() - timedelta(days=10)
end = end_date.strftime('%Y%m%d')
def drop_pars(tableName):
t = o.get_table(tableName)
s = list(filter(lambda x: x.name < "ds='{}'".format(end), t.partitions))
for par in s:
par.drop()
drop_pars("dhub_trade")
drop_pars("dhub_ft_trade")
drop_pars("dhub_dn_trade")
drop_pars("dhub_wms_trade")
drop_pars("dhub_trade_send")
drop_pars("dhub_wms_trade_send")
可以在dataworks里面新建個(gè)pyodps的節(jié)點(diǎn)來每天運(yùn)行播掷,一勞永逸。
如果是放在python本地運(yùn)行的話建議使用ipython撼班。具體還需要配置下odps的環(huán)境歧匈。可以參考下官方文檔砰嘁。
后語
Dataworks使用中分庫分表很多件炉,怎么配置大量的同步任務(wù)勘究。有經(jīng)驗(yàn)的可以一起研究下。