阿里云maxcompute(原odps)歷險(xiǎn)記

1. MAXCOMPUTE(原odps)踩坑:

1、 在使用split_part(info, ‘|’, 1)函數(shù)切分?jǐn)?shù)據(jù)時(shí),要格外注意分隔符’|’,尤其是涉及有非字母、數(shù)字的數(shù)據(jù),其中可能會(huì)夾雜’|’,這樣就導(dǎo)致取出的數(shù)據(jù)不一致;其實(shí)是應(yīng)該注意切分之前的字符串組裝concat()函數(shù),在組裝時(shí)使用的分隔字符。

2、 odps是一個(gè)數(shù)據(jù)倉(cāng)庫(kù),有分層的概念,它的dwd層類型數(shù)據(jù)庫(kù),又有全量更新的dd類型(即,每天更新歷史和最近一天新增一天數(shù)據(jù))和每天增量更新的ds類型(即,每天的數(shù)據(jù)存放在一個(gè)分區(qū))。dd表遇到一個(gè)坑是:有可能按前一天取數(shù)據(jù)仍然還沒有或沒更新,這樣可以利用max求最近一天數(shù)據(jù):

select * from table_name 
where partition_name IN (select max(partition_name) from table_name));

3、延伸2,odps提交工作流任務(wù)有幾個(gè)概念:

1.  今天提交的任務(wù)明天到調(diào)度時(shí)間時(shí)才會(huì)運(yùn)行;
2.  今晚12點(diǎn)之前會(huì)使用最新提交的代碼生成明天要跑的實(shí)例;
3. 實(shí)例生成之后就跟代碼沒有關(guān)系;
4. 停止一個(gè)周期任務(wù)運(yùn)行只能通過刪除代碼的方式。

最好不要使用to_char(dateadd(getdate(), 0, 'dd'), 'yyyymmdd'),即getdate()獲取分區(qū)時(shí)間,因?yàn)閛dps任務(wù)涉及幾類時(shí)間:

1. 業(yè)務(wù)時(shí)間:運(yùn)行時(shí)間 - 1天(運(yùn)行時(shí)間減一天);
2. 調(diào)度時(shí)間:阿里云周期調(diào)度時(shí)間,可能會(huì)存在排隊(duì)現(xiàn)象;
3. 運(yùn)行時(shí)間:任務(wù)被調(diào)度后獲得計(jì)算資源時(shí)間。(getdate()獲得的時(shí)間,
   這個(gè)時(shí)間可能和計(jì)算邏輯想要的時(shí)間有偏差)

4、odps select if()語(yǔ)句中支持like,不支持in;

5、如果需要concat()數(shù)據(jù),需要將空值補(bǔ)一個(gè)值,因?yàn)?concat('a', null, 'b') = NULL,一個(gè)null會(huì)導(dǎo)致所有值都失效。

2. 計(jì)算一個(gè)區(qū)域的流入流出,直接上圖

區(qū)域流入流出算法

相當(dāng)于是兩張表join,假設(shè)A表為新表,B表為舊表,則黃色部分為流入,深藍(lán)色為流出,淺藍(lán)色為兩天都存在。計(jì)算時(shí)可以先做一個(gè)full outer join, 然后當(dāng)B.key is null,則為流入;A.key is null,則為流出。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容