摘要: 在過去的兩年內,MaxCompute進行了翻天覆地的重構,從1.0版本全面升級到了2.0版本。而你們或許對於MaxCompute 2.0的一些新特性並不瞭解,在本文中,MaxCompute技術專家秋鵬就爲你們詳細介紹MaxCompute 2.0的新特性。算法
摘要:在過去的兩年內,MaxCompute進行了翻天覆地的重構,從1.0版本全面升級到了2.0版本。而你們或許對於MaxCompute 2.0的一些新特性並不瞭解,在本文中,MaxCompute技術專家秋鵬就爲你們詳細介紹MaxCompute 2.0的新特性。sql
本文主要圍繞如下三個方面進行分享:
MaxCompute 2.0簡介
MaxCompute 2.0 vs 1.0
MaxCompute 2.0 vs 競品session
1、MaxCompute 2.0簡介併發
MaxCompute之因此要進行重構是由於MaxCompute 1.0上存在不少問題,在MaxCompute 2.0的概念提出前,MaxCompute就已經在線上服務內部和外部用戶一段時間了,而且也得到了一些積極的反饋。可是MaxCompute 1.0中也存在一些問題須要解決,這些問題大概分爲兩個部分。首先,一些競爭對手好比Hive、Spark等用了不少MaxCompute尚未用上的新功能,他們可以達到比MaxCompute更加高效的性能,這就迫使MaxCompute嘗試增長新的功能,而且優化自身引擎,解決已知的問題。在引入新功能的過程當中,發現須要對於MaxCompute引擎進行重構,使得引擎可以支持新功能。此外,MaxCompute 1.0在用戶開發體驗上有待提高,相比於Hive以及MySQL存在必定差距,從原有系統向MaxCompute遷移存在必定的不兼容問題,這也制約了MaxCompute對於外部用戶的吸引力。此外,在MaxCompute 1.0的開發過程當中缺少完善而且好用的集成開發環境,使得用戶開發較爲困難。框架
所以,基於1.0版本所存在的問題,MaxCompute就進行了一系列的改進,並提出了MaxCompute 2.0的概念。MaxCompute 2.0首先提出了三個重要的設計目標:強大的編譯器,包容的生態以及高效的引擎。首先,編譯器須要支持腳本式語言,可以讓用戶輕鬆編寫複雜邏輯,還須要可以支持強大的IDE功能,好比實現錯誤實時提示以及代碼填充等,從而提升用戶開發體驗。對於生態而言,須要使得MaxCompute的SQL支持標準SQL,還須要兼容開源生態,使得用戶能夠方便地將原有應用遷移到MaxCompute上。最後一點,還須要利用最新的分佈式計算框架來優化執行引擎,從而使得執行的效率更高。分佈式
2、MaxCompute 2.0 vs 1.0ide
前面所講的更多的是站在系統層面進行分享,接下來將圍繞你們平常開發使用MaxCompute來進行分享,本部分主要將對比MaxCompute 2.0版本和1.0版本的區別所在。工具
編譯器
MaxCompute 2.0在編譯器上進行了徹底重構,也進行了大量的優化,如圖所示列舉了部分關鍵點,好比全部編譯錯誤都會行列號信息,這樣的中括號格式可以方便IDE來實現各類各樣的自動化處理;第二個就是全新的error key,相比於以前的error code具備更高的可讀性;此外更重要的一點就是MaxCompute 2.0的編譯結果更多是包含warning的,warning是編譯器在用戶的SQL裏面發現的有可能存在潛在問題的狀況,而這些問題卻並不會影響用戶的SQL進一步編譯和執行,可是編譯器認爲有必要將這些潛在問題提出來讓用戶改正。此外,MaxCompute 2.0編譯器很是重要的一點新功能就是其支持錯誤恢復,這裏的錯誤恢復指的是當碰到用戶錯誤的時候會嘗試去猜想用戶SQL的實際意圖,嘗試去將錯誤恢復出來繼續進行編譯,這樣的好處就是在同一次編譯中的屢次錯誤會一次性地報出來,方便用戶修改。這一功能對於IDE而言是很是重要的,由於當用戶使用IDE來作語法檢查的時候會發現IDE可以將整個腳本中的全部錯誤同時標識出來。性能
數據類型
MaxCompute 2.0新增了不少數據類型,以下圖所示。能夠看出,MaxCompute 1.0只支持了幾個有限的數據類型,這些數據類型其實在大多數場景下實際上是夠用的,可是將應用從已有的開源系統上移植過來的時候就會顯得不足。而MaxCompute 2.0中更多的數據類型可以支持更豐富的表達能力。此外,MaxCompute 2.0還增長了不少常量的定義,好比TINYINT、SMALLINT、DATETIME以及TIMESTAMP等。固然了,這裏也有兩點須要注意,一點就是使用新類型須要使用新類型須要set odps.sql.type.system.odps2=true; 或者開Hive兼容。此外,還須要注意MaxCompute實際還支持CHAR類型和INTERVAL 類型,目前僅當打開Hive兼容模式下可用。優化
複雜類型
此外,MaxCompute 2.0還對於複雜類型進行了補充,支持了ARRAY、MAP以及STRUCT三種類型,而且這些複雜類型能夠任意嵌套。MaxCompute 2.0對於複雜類型的定義、構造以及操做都進行了擴充,所以用戶能夠很輕鬆地使用這些複雜類型來實現複雜的邏輯。
語法結構
MaxCompute 2.0相比於1.0增長了以下圖所示的不少語法結構。首先是Values表達式,其並非MaxCompute原創的,在其餘的SQL語言中也有,可是在MaxCompute 1.0中並無支持,這就致使在MaxCompute 1.0裏面構造一個簡單的數據是很是困難的。在MaxCompute 2.0中,由於支持了Values表達式,所以用戶能夠直接在SQL裏面經過Values表達式來構造一個簡單的維表。此外,目前還能夠在Select語句中省略from表達式,至關於Select一個一行的values。
第二個新增的語法叫作「Common Table Expression(CTE)」,簡單而言CTE可讓用戶經過使用WITH語句將子查詢提早,而踢到前面的SubQuery能夠被反覆使用,即所謂的Common Table,並且Common Table之間能夠相互引用。此外一個新增的語法及時「SEMI/ANTI JOIN」,這兩個語法其實算是SQL標準的功能,SEMI JOIN的語義是當JOIN條件知足的時候返回知足條件的行,而ANTI JOIN與以前剛好相反,就是當JOIN條件知足的時候就過濾掉知足條件的行,保留不知足條件的行返回。
MaxCompute 2.0還支持了更加豐富的子查詢表達式,在MaxCompute 1.0中只支持了IN的SubQuery表達式,而在MaxCompute 2.0則引入了兩種新表達式,一種是EXISTS表達式,其含義是當後面的表達式有結果返回時爲TRUE,不然爲FALSE;另外一種叫作SCALA SubQuery,也就是當後面的子查詢可以肯定是一行一列的時候,子查詢能夠當作標量使用,進而能夠參與其餘表達式的計算。此外,在MaxCompute 2.0子查詢中支持了correlated,這使得子查詢的結果再也不是固定的值,而是會根據外部表的行進行改變。MaxCompute 2.0提供的另一個重要功能就是「SELECT TRANSFORM」,該語法徹底與Hive兼容,其容許用戶使用第三方腳原本處理數據。另一個引入的新功能是「User Defined Type」,這是MaxCompute獨有的功能,這個功能很是好用,其容許用戶直接在SQL中嵌入第三方語言,目前只支持了Java。使用new就能夠建立對象,能夠直接調用對象公共方法和訪問公共屬性,並且整個JDK均可以直接使用,還能夠經過設置odps.sql.session.resources引用第三方包。
MaxCompute 2.0還支持外表和非結構化存儲,簡單而言在MaxCompute 1.0裏面,用戶只能引用內部定義的表,好比建立表以後將數據上傳上去纔可以使用。而目前的過程徹底能夠利用外表來實現,用戶能夠定義和建立一個外表,能夠直接從外部數據源讀取數據,這樣就省略了數據遷移的過程。而外部數據和內部數據的存儲確定不一致,所以MaxCompute 2.0還引入了對於非結構化數據進行處理的機制,好比經過定義StorageHandler來處理非結構化存儲的序列化、反序列化以及讀寫過程。值得注意的是MaxCompute 2.0的外表在語法等方面徹底兼容Hive,所以Hive用戶能夠很是輕鬆地向MaxCompute 2.0進行遷移。MaxCompute 2.0還提供了「CLUSTERED BY」功能,咱們能夠在建立表的過程當中指定表按照某一列進行CLUSTERED BY,這將會爲表創建一個彙集索引,可以使用戶在查詢中利用索引進行優化,減小讀入的數據量。還有一個新功能就是「User Defined Join」,藉助此功能用戶能夠自定義表的鏈接過程,本來的內置JOIN過程均可能會產生笛卡爾積結果,可能作了過多的爆炸式展開,而經過User Defined Join將會大大減小中間結果的產生。
腳本模式
MaxCompute 2.0提供了腳本模式功能,在腳本模式下,用戶所提交的腳本再也不是以單條SQL爲單位的,而是以整個腳本爲單位提交查詢,所以更適合複雜的查詢。此外,腳本模式可使用DDL語句,而且能夠有多個不一樣的輸出,能夠有屢次insert into以及多個insert override等,因此腳本模式可以最大限度地幫助用戶編寫複雜的邏輯。雖然腳本模式中,腳本是按照一整個腳本提交的,可是並不會逐條執行,而是將整個腳本做爲一個完整做業執行,其優勢就是對於一些重複操做能夠合併到一塊兒。
參數化視圖
在MaxCompute 1.0版本的視圖定義中,並不容許傳遞參數,可是在2.0版本中則引入了參數化視圖功能,該功能容許用戶在定義VIVIEW時候定義參數,根據參數的不一樣使得VIEW的邏輯會出現一系列變化,這樣就可以大大提高VIEW代碼的重用能力。若是可以設計得很好,那麼用戶的絕大部分邏輯都能經過VIEW基於過程的過程方式實現。
MaxCompute Studio
MaxCompute 2.0提供了對於IDE的強大支持,其在開始研發的過程當中就伴隨這MaxCompute Studio的設計和實現了。而MaxCompute Studio也提供了一些很是重要的功能,好比做業監控、做業分析、實時錯誤提示以及智能提示等。經過MaxCompute Studio,用戶能夠很是直觀地監控做業的執行流程,幫助用戶直觀地掌控執行流程中的各個節點信息;此外,MaxCompute Studio還提供了一系列分析工具,幫助用戶分析參與做業的各個節點的執行信息等;此外,還提供了不少對於SQL開發的支持功能,好比用戶在MaxCompute Studio中作編輯的時候,就會把用戶的腳本作本地編譯,並發現其中存在的問題,而後以圖形化方式報告給用戶;另一個就是實現了上下文提示,提示功能很是智能化,而這在開發腳本的過程當中也是很是有幫助的。
即將上線的功能
除了上述功能以外,MaxCompute 2.0版本中還有以下圖所示的不少即將上線的功能,好比GROUPING SETS和CUBE/ROLLUP、INTERSECT/EXCEPT、內存計算、Java Runtime與Local run、更完善的腳本語言支持以及Table API支持等。
3、MaxCompute 2.0 vs 競品
Hive兼容模式
最後與你們簡單介紹一下MaxCompute 2.0與其餘競品的區別。之因此介紹這一點,是由於一些用戶指望從其餘的產品上向MaxCompute 2.0進行遷移,但願可以對於MaxCompute所支持的功能以及難度有一個直觀的瞭解。其實,MaxCompute 2.0對於Hive具備很是強的兼容能力,當用戶經過設置「SET odps.sql.hive.compatible=true;」就能夠打開Hive兼容模式。在兼容模式下,不只可以兼容Hive的語法結構,還可以對於數據類型、語義以及UDF和StorageHandler進行兼容。當打開MaxCompute 2.0的兼容模式,那麼在Hive上運行的應用就可以很是方便地遷移到MaxCompute 2.0平臺上來。固然了,MaxCompute 2.0與Hive還存在一些在設計上的不兼容的地方,好比某些操做和MaxCompute概念不符合,好比database、schema等,所以沒有支持;在權限管理上,某些方式和MaxCompute不符,如column的權限管理,沒有支持。MaxCompute的resource是全局的,所以某些操做,如CREATEFUNCTION須要指定resource。而這些不兼容的地方,對於用戶也沒有太大影響,所以對於用戶而言,從Hive向MaxCompute進行遷移是很是方便的。而在MaxCompute在將來也將會支持任何符合SQL標準的語法。
MaxCompute 2.0核心優點
MaxCompute 2.0除了在兼容方面作得比較好以外,還存在着不少的核心優點。首先,最大的優點就是MaxCompute是企業級服務,可以提供7*24小時不間斷服務的系統級平臺,會有專業人員對於問題進行支持。MaxCompute 2.0具備包容的生態圈,你們能夠從各個平臺上遷移過來,從而實現完整統一的計算系統。此外,MaxCompute 2.0所提供的更豐富的擴展能力可以讓用戶更方便地擴展SQL能力。腳本模式和參數化視圖可以讓用戶用腳本方式開發複雜的邏輯,從而實現複雜的功能。MaxCompute Studio所提供的強大的開發調試的支持,也是企業競品所沒有的。在通過一系列的改進以後,MaxCompute 2.0的執行引擎、優化器都是用了最新的算法模型和框架,所以性能不會輸給任何競品,而且已經通過了內部無數次驗證,所以用戶能夠放心使用。