MaxCompute-ODPS重灌上陣 第一彈-善用MaxCompute編譯器的錯誤和警告

振禹發表於2017-10-17

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指令碼檔案, 如下

screenshot.png

可以看到

  1. 第一個insert語句中wm_concat函式使用有錯誤
  2. 第二個insert有一個錯誤和一個警告,錯誤是列名寫錯了
  3. 警告則是上面場景二種提到的,ODPS中當比較bigint與double的時候,會隱含的都轉為double, 因為從string到double是有可能在執行時導致錯誤的轉換,所以MaxCompute編譯器會在此警告要您確定這個是不是您希望的行為
  4. 滑鼠停止在錯誤或者警告( 注3 )上,會直接提示具體錯誤或者警告資訊。

如果我不修改錯誤,直接提交,會被MaxCompute Studio擋住,如下圖
screenshot.png

按照提示修改錯誤和警告,如下圖,

screenshot.png

再次提交,可以順利的執行,再也不用擔心因為語法錯誤白等了!

事實上,使用MaxCompute Studio可以把所有警告都設定為錯誤,如下圖

screenshot.png

這樣就可以保證不會不小心漏掉任何有可能的錯誤!

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,在需要的時候修改提示的問題,就不會再掉進這個坑裡了!
  • 注3 對於警告的標註,我的設定是黃色波浪線,可以通過IntelliJ的Settings來修改,如下
    screenshot.png


相關文章