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,在需要的時候修改提示的問題,就不會再掉進這個坑裡了!
- 注3 對於警告的標註,我的設定是黃色波浪線,可以通過IntelliJ的Settings來修改,如下
相關文章
- MaxCompute-ODPS重灌上陣 第三彈-複雜型別型別
- Oracle編譯器警告Oracle編譯
- 編譯PHP的錯誤編譯PHP
- 【53】不要輕忽編譯器的警告編譯
- Ubuntu上的pycrypto給出了編譯器錯誤Ubuntu編譯
- VS 編譯錯誤編譯
- IDEA報錯java: 編譯失敗: 內部 java 編譯器錯誤IdeaJava編譯
- ipvs編譯錯誤編譯
- php編譯小錯誤PHP編譯
- 經典的編譯錯誤 (轉)編譯
- 精讀《手寫 SQL 編譯器 - 錯誤提示》SQL編譯
- ios xcode警告和錯誤彙總iOSXCode
- opencv 編譯常見錯誤OpenCV編譯
- 最近編譯tolua_runtime安卓編譯錯誤編譯安卓
- 禁用 C# 編譯器對某段程式碼的警告C#編譯
- 編譯EJB出現錯誤的解決編譯
- JB7的常見編譯錯誤!!編譯
- PHP編譯安裝時常見錯誤解決辦法,php編譯常見錯誤PHP編譯
- PHP編譯configure時常見錯誤,和PHP7.1.4 編譯安裝PHP編譯
- 淺談彙編器、編譯器和直譯器編譯
- 編譯器的自展和自舉、交叉編譯編譯
- Include檔案易犯編譯錯誤編譯
- 編譯錯誤,請教一下!編譯
- Docker環境編譯時的錯誤記錄Docker編譯
- 編譯notepad++的錯誤解決編譯
- 執行無法解決的編譯錯誤編譯
- 編寫在瀏覽器中不彈出警告的ActiveX控制元件瀏覽器控制元件
- 一個C++巨集定義與列舉定義重複的編譯錯誤C++編譯
- Lombok 的@ToString導致的Maven編譯錯誤LombokMaven編譯
- 編譯錯誤 --- does not name a type和field `XX' has incomplete type編譯
- 編譯錯誤導致浪費10多分鐘, 編譯錯誤的提示:xxx does not name a type xxx編譯
- 善用瀏覽器的一些除錯技巧瀏覽器除錯
- Rust編譯器比其他語言更能捕獲隱藏的錯誤 - kerkourRust編譯
- webpack編譯vue出現dev警告Web編譯Vuedev
- Python忽略warning警告錯誤Python
- Error page: / Error infos: DedeCms錯誤警告Error
- xcode 編譯opencv ios容易出現的錯誤XCode編譯OpenCViOS
- 正確理解PHP程式編譯時的錯誤資訊PHP編譯