票選最美雲上大數據暨大數據技術峯會上,阿里雲飛天一部高級專家振禹爲你們帶來題爲「MaxCompute SQL 現狀與展望」的演講。本文重點解析了MaxCompute SQL 現狀,詳細介紹了各類功能,其中包括編譯器用戶友好功能、複雜類型、CTE、參數化視圖和SEMI JION等,接着說明了MaxCompute SQL即將完成與推動中的功能,最後做了簡要總結。數據庫
如下是精彩內容整理:express
MaxCompute SQL 現狀緩存
目前MaxCompute SQL能力不是很強,雖然在性能、安全和成本控制上獲得了業界一直認定,不少用戶利用它支撐本身的核心業務,但也有對其不滿意的方面,MaxCompute SQL與大數據運算方面的Hive、Orcale、SQL Server等都有很大差別,在標準的SQL支持上也有改進的地方。安全
開源生態需求服務器
在作SQL兼容或擴充時,考慮到優先級將功能分紅三方面,具體以下:session
– 數據類型與內建函數分佈式
– UDF二進制兼容函數
– 外部文件存儲與不一樣格式支持工具
– 標準語言功能oop
– 外表支持,多數據格式支持
– CLUSTERED TABLE/TRANSFORM/CUBE
– MaxCompute Studio 等易用性改進
– 特點語言功能 – TABLE VARIBLE, Parameterized View
編譯器用戶友好功能
對於分佈式系統,性能、成本都很是重要,更重要的是做爲開發者的時間,若是你們花大量時間在查各類語言功能、寫錯就要debug半天、發現某參數沒有傳對等瑣碎事情上,在集中開發時會浪費你們大量時間,不論MaxCompute仍是Hive,目前都只支持提交有一個語句,若是在一個文件中一次提交多個語句,實際上也是一句一句向服務器提交的,若是最後一句出現語法或語義錯誤,也不會在client報告,可能前面幾句已經執行若干小時才跑到最後一句,而後通知你最後一句某函數參數傳錯,這種狀況會讓人沮喪。MaxCompute 基於新一代SQL引擎,提供了新數據開發的IDE,叫MaxCompute Studio,MaxCompute Studio做了編譯器深度集成,方便解決上述問題。
圖爲MaxCompute Studio的兩個窗口,左側窗口中,第一個語句中有函數多傳了一個參數,最後一個語句中有一列在原表中不存在,MaxCompute Studio在進行文本編輯時就能夠將全部信息錯誤標註出來,並能告訴你們錯誤是怎樣的,將鼠標放在紅色部位便可顯示,MaxCompute SQL是一個集成在開發環境中的插件,你們能夠立即修正錯誤,確保在client端解決掉全部錯誤,並且MaxCompute SQL引擎能夠對不安全轉換髮出警告;右側窗口中,使用MaxCompute Studio,能夠自動列出全部columns,該功能上下文相關,包括buliding function和keywords的提醒,隨着敲擊均可以計時提醒哪些東西是否合法,您只要使用這個功能,天然而然作到程序零錯誤。
該功能的目的是提升用戶開發效率、下降服務負載;目前具有compiler錯誤恢復能力,提供強大多error, warning功能,賦能MaxCompute Studio;將來,咱們會提供更強大與精準的提示能力,會推出代碼重構能力,咱們也會在集成代碼MaxCompute Studio裏向你們提供智能建議。
基本數據類型
目前MaxCompute1.0支持6個數據類型,對於絕大部分場景足夠,能夠減小遷移成本,做爲鏈接第三方工具(Tableau,HiveHPL)。好比integer ,MaxCompute1.0提供BEGINT數據類型,簡潔的好處是減小選擇,但有時數據類型豐富也確實可以帶來更強的表達能力,尤爲是從其它系統向MaxCompute遷移時,可能須要將類型進行映射,因此在MaxCompute即將推出將基本數據類型擴充,支持所有Hive數據類型和常量表示,時間類型支持國際化 ,時區可訂製。將來咱們會進一步擴充數據類型,修正decimal類型,既能改善性能、節省存儲,也可以把業務場景裏的行爲表現精確。
複雜類型
複雜類型在廣告等場景經常使用,方便UDF開發,複雜類型也是很經常使用的一些功能,Maxcompute1.0也支持複雜類型,array和map,可是會有些限制,好比array和map下標類型必須是常量,不能嵌套;到了2.0支持struct,沒有任何限制,能夠任意嵌套。好比廣告商打廣告,每一個廣告會有出價競標keyywords,隨着不一樣的出價能夠拿到廣告中impression click,造成幾條曲線,每個廣告點性能的數據造成了struct,全部的出價點造成了array。咱們支持除UNION(Hive不推薦使用)外所有Hive複雜數據類型,全部Hive配套函數。將來,咱們會進一步擴充複雜類型支持,放鬆限制,排序去重,支持UDT。
SQL語法 - CTE
CTE爲common table expression,在各個數據庫語言中比較經常使用,徹底兼容Hive。左側圖所示,若是寫複雜的SQL,要依賴層層嵌套的subquery,某些用戶的腳本已經嵌套四五層時,書寫、維護都很不方便,subquery須要反過來寫,不容易處理,而且兩個分支上的subquery的SQL如出一轍,徹底依賴subquery智能將SQL寫的如出一轍,必須備份兩份,會給代碼維護帶來不方便。而右側圖是與左側圖徹底等效的寫法,with子句定義了一系列inners,每一個inner對應SQL子句,後面就能夠直接訪問前面對應好的子句,每個子句至關於定義一個變量,可供屢次引用。
VALUES
VALUES最經常使用的地方是insert,當準備不是大量數據時,傳統的database用法只需準備一個文本文件,將全部VALUES都準備好,執行有一個SQL語句便可將全部數據準備好,老版本的MaxCompute1.0不支持這種語句,準備數據的方式是經過tunnel上傳,雖然方式沒有問題,但會給遷移帶來額外工做。而在新一代MaxCompute中,insert、VALUES能夠支持了,支持Insert column list,Values table選取是MaxCompute的特點功能。
SEMI JION等其餘改進
SEMIJOIN是各個數據庫系統中經常使用的功能,常見的體現方式爲IN subquery和EXISTS,像Orcale、SQLServer、Hive都會將其轉成JOIN,稱爲半鏈接,半鏈接分爲ANTI JOIN和SEMIJOIN,SEMIJOIN是指用右表數據過濾左表,右表有就返回左表數據,ANTI JOIN爲右表沒有即返回左表數據。SEMIJOIN兼容Hive,兼容Impala ANTI JOIN。
同時,MaxCompute還支持Implicit Join和UNION [DISTINCT]。
查詢過程與參數化視圖
在大數據查詢時,會將全部語句編成統一一個執行計劃運行,避免作一個一個語句的操做,對於Hive來講,也能夠將一系列語句寫到文件中提交,語句之間徹底是分開提交的,服務器端每次看到的只是本來文本文件中的一個語句,中間的聯繫主要靠表實現,表達能力和性能方面都是有欠缺的。
圖爲MaxCompute Studio截圖,經過查詢過程寫出一個程序,能夠看到分紅三個部分:首先set語句定義一些設定,其次DDL語句準備一些table,最後是一系列的DML查詢語句,此查詢語句與傳統查詢方式不一樣,每個都是定義變量等同於查詢語句,變量能夠反覆使用,它比CTE更加靈活,能夠任意引用,屢次insert。查詢過程當中會造成單一完整的一個執行計劃,這與寫一個複雜語句在性能上是沒有區別的,整個程序會一次性提交到服務器端一次性執行,會在維護性和性能方面帶來很大好處。
MaxCompute支持視圖,根據數據表提供有意義的運算,這些運算不必定要每次計算出來,而是直接寫SQL語句,這些語句就變成了視圖,SQL語句就從準備好的表裏抽取數據,作出必定運算後再提供給調用者調用,這樣作的好處是封裝保證了底層改變時不須要讓全部調用者都作任何變化,只需將view更新,另外,代碼能夠反覆使用。
圖中能夠看出,左側有兩個參數化view。第一個能夠提供參數列表,表中有表變量和string變量,SQL語句能夠直接引用這些變量;第二個begin-end裏就是查詢過程,寫法徹底同樣,區別是它能夠引用參數列表提供的參數,對於view來講,定義一個返回變量,對變量進行賦值便可。右邊圖中能夠看到如何調用參數化的view,之後你們能夠徹底在MaxCompute上提供用查詢語言寫出的過程庫和函數庫,提供給別人去用。
內建函數
語言自己以及語言提供的函數庫是否易用和豐富很重要,兼容性也是必需要考慮的問題。
咱們大大新增了函數 ,擴充接近一倍,具體包括如下函數:
– 數學函數 log2,log10,bin, hex,unhex,crc32,sha1,shar2,degrees,nullif,radians,sign,e,pi,
factorial,cbrt, shiftleft, shiftright, shiftrightunsigned
– 日期函數 unix_timestamp, to_date, year, quarter, month, day, dayofmonth, hour, minute,
second,millisecond,nanosecond,date_add, date_sub, from_utc_timestamp, current_date,
current_timestamp, add_months, last_day, next_day, trunc, months_between
– 字符串函數 concat_ws, lpad, rpad, replace, soundex, substring_index
– 聚合函數 collect_list, collect_set
– 表操做函數 posexplode, stack, inline, parse_url_tuple
– 複雜類型操做函數 map,struct,named_struct, map_values,map_keys, sort_array
將來支持所有Hive Built-in函數(包括Window函數)與其餘DBMS典型函數,目前有些函數調用了Java,改成Native提升性能。
UDF/UDAF/UDTF
– 下降用戶遷移成本
– 兼容生態工具
– 擴大MaxCompute自身能力,例如HPL
– 二進制兼容Hive2.1 UDF/UDAF/UDTF, 無需遷移 ,註冊成MaxCompute函數就能用
– 限制安全沙箱,不少第三方庫因使用受限功能沒法使用 (訪問磁盤,使用反射等)
– 安全支持虛擬化,第三方庫可用
– 註冊方式兼容(不必定須要,與Session支持統一考慮)
– UDT (User Defined Type) – 與Java的無縫集成
EXTERNAL TABLE / STORED AS
數據上雲,兼容Hadoop/Hive現有數據。在Hadoop/Hive裏,數據進入系統最經常使用的方式是將數據上傳到HDFS,在Hive裏有external table,能夠指定location在哪,再指定數據文件格式,就可使用了,天天數據往HDFS裏上傳,在MaxCompute裏支持的方式是datahub和tunnel,爲的就是方便你們遷移適應各類各樣的場景。
目前MaxCompute的進展以下:
– 二進制兼容Hive全部內建文件格式與SerDe(行格式)
– TEXTFILE,SequenceFile,RCFile,AVRO,Par quet, ORC
– 文件按存儲在OSS上,直接訪問
將來將會支持STORED BY 「StorageHandler」支持與OTS,Hbase類的DBMS的互通。
即將完成與推動中的功能
– CREATE TABLE … [RANGE] CLUSTERED BY (col1,…) SORTED BY (col1, …) INTO <n> Buckets ...
– hash cluster與hive兼容,提升性能與兼容性
– range cluster,MaxCompute特點,支持海量排序與交互式查詢
– 內存中cache熱表,提升性能。
ALTER TABLE t SET TBLPROPERTIES(‘cache’=‘true’) ;t 的內容緩存在內存中,屢次訪問無需讀盤
– 與table variable結合,緩存熱點查詢,提升性能。
@a := CACHE ON SELECT …; -- @a的結果緩存在內存中
@b := SELECT * from @a a join @a b on …; 屢次訪問 @a ,從內存中直接讀取,無需從新計算。
– UDJ (User Defined Join)
– GROUPING SET, TRANSFORM, session等,根據客戶須要有選擇的支持
總結