MaxCompute - ODPS重裝上陣 第一彈 - 善用MaxCompute編譯器的錯誤和警告
MaxCompute (ODPS) ( 注1 )是阿裏雲自主研發的具有業界領先水平的分布式大數據處理平台, 尤其在集團內部得到廣泛應用,支撐了多個BU的核心業務。 ODPS2.0除了持續優化性能外,也致力於提升SQL語言的用戶體驗和表達能力,提高廣大ODPS開發者的生產力。
基於ODPS2.0新一代的SQL引擎,MaxCompute顯著提升了SQL語言編譯過程的易用性與語言的表達能力。
我們在此推出MaxCompute(ODPS2.0)重裝上陣係列文章
第一彈 - 善用MaxCompute編譯器的錯誤和警告
第二彈 - 新的基本數據類型與內建函數
第三彈 - 複雜類型
第四彈 - CTE,VALUES,SEMIJOIN
這次首先向您介紹在易用性方麵的改進。
場景1
作為ODPS的開發者,提交了一段SQL腳本,裏麵兩句SQL,等了半天排上隊,結果發現第一句裏麵有個函數的參數類型錯誤,白等了。。。;修改腳本後再次提交,排隊,第一條語句用了兩個小時跑完了,然後報告第二個語句漏了半邊括號。。。場景2
我的上遊數據有個表create table my_upperstream(..., id string) partitioned by (...), 我的項目每天有一個任務要和my_uppertstream在id上join,... join my_upperstream u on id = u.id,過去沒有問題,最近總是發現有些數據莫名其妙的丟失,經過幾天痛苦的debug,終於發現是因為我的id是bigint,在和u.id比較的時候,都竟然轉成了double,因為浮點誤差導致某些列join不上( 注2 );
怒氣衝衝在ODPS用戶群中中質問,竟然告訴我這個是by design! 。。。
MaxCompute編譯器基於ODPS2.0全新自主研發的SQL引擎,尤其配合使用MaxCompute Studio,提供了豐富的錯誤提示與警告的功能。可完全避免以上問題。
編譯器的易用性改進
為了充分發揮MaxCompute編譯器的易用性改進,最好配合MaxCompute Studio (D2平台對ODPS2.0的錯誤與警告的支持正在積極開發中,預計今年9月份上線,敬請期待!)。首先,請安裝MaxCompute Studio,導入測試MaxCompute項目,創建工程,建立一個新的MaxCompute腳本文件, 如下
可以看到
- 第一個insert語句中wm_concat函數使用有錯誤
- 第二個insert有一個錯誤和一個警告,錯誤是列名寫錯了
- 警告則是上麵場景二種提到的,ODPS中當比較bigint與double的時候,會隱含的都轉為double, 因為從string到double是有可能在運行時導致錯誤的轉換,所以MaxCompute編譯器會在此警告要您確定這個是不是您希望的行為
- 鼠標停止在錯誤或者警告( 注3 )上,會直接提示具體錯誤或者警告信息。
如果我不修改錯誤,直接提交,會被MaxCompute Studio擋住,如下圖
按照提示修改錯誤和警告,如下圖,
再次提交,可以順利的運行,再也不用擔心因為語法錯誤白等了!
事實上,使用MaxCompute Studio可以把所有警告都設定為錯誤,如下圖
這樣就可以保證不會不小心漏掉任何有可能的錯誤!
MaxCompute團隊建議您在提交任何腳本之前,都使用MaxCompute Studio對腳本進行靜態編譯檢查,並強烈推薦將警告設定為錯誤,在提交前修改所有的警告,這樣可以花很少的時間避免大量花費大量計算與人力資源的錯誤。
除了可以幫助您節省時間外,也可以節省MaxCompute服務器端資源,目前每天MaxCompute SQL服務器花大筆計算資源在編譯那些有錯誤的SQL,連累沒有錯誤的也要跟著排隊。
另外您知道嗎?提交有錯誤的腳本會導致扣您的計算健康分,導致以後提交任務的優先級被下調!某些警告報告的問題也會導致扣除健康分,使用MaxCompute Compiler和Studio,可以幫助您避免此類扣分,避免被降級!
警告中很多情況是不安全的隱式類型轉換,如果確實是想要的轉換,可以用cast (xxx as )的方式消除警告,如果覺得這麼寫麻煩,MaxCompute 編譯器還提供一種簡潔的方式(xxx),如上麵修改過的腳本所示。具體該用哪種完全取決於您的偏好。MaxCompute還有一係列的SQL語言方麵的改進,此係列會向您逐一介紹。
小節
基於ODPS2.0 SQL引擎的MaxCompute新編譯器配合MaxCompute Studio,通過完整準確地報告錯誤於警告,可以顯著提高用戶的生產力。不過提升生產力不能隻靠準確的錯誤和警告,豐富強大的SQL語言表達能力一樣重要,從下一篇開始,我們向您介紹MaxCompute在SQL語言上的各項改進!
標注
注1 MaxCompute就是ODPS,是ODPS在阿裏雲上的品牌,本係列文章中,MaxCompute與ODPS可以通用。
注2 為什麼int = string的時候要轉double呢?因為這個是Hive的行為,MaxCompute(原ODPS) 在當初第一版的時候,為了替換當時廣泛使用的Hive腳本,不得不兼容。現在有了警告,隻要大家按照建議的方式使用MaxCompute,在需要的時候修改提示的問題,就不會再掉進這個坑裏了!
最後更新:2017-10-17 17:33:54