第九彈 - 腳本模式與參數視圖-阿里云開發者社區

開發者社區> 阿里巴巴大數據計算> 正文

第九彈 - 腳本模式與參數視圖

簡介: MaxCompute提供了新的腳本模式與參數化視圖,可以明顯提高開發者的編程效率,提高代碼的可重用性,與此同時,也提高了性能!

MaxCompute(原ODPS)是阿里云自主研發的具有業界領先水平的分布式大數據處理平臺, 尤其在集團內部得到廣泛應用,支撐了多個BU的核心業務。 MaxCompute除了持續優化性能外,也致力于提升SQL語言的用戶體驗和表達能力,提高廣大ODPS開發者的生產力。

MaxCompute基于ODPS2.0新一代的SQL引擎,顯著提升了SQL語言編譯過程的易用性與語言的表達能力。我們在此推出MaxCompute(ODPS2.0)重裝上陣系列文章

第一彈 -
第二彈 -
第三彈 -
第四彈 -
第五彈 -
第六彈 -
第七彈 -
第八彈 -

第八彈中提到了參數化視圖,本篇就向您介紹MaxCompute 腳本模式和參數化視圖。

  • 場景1
    項目有個業務處理邏輯很復雜,需要讀多個表可以领救济金的游戏,某些表之間需要join,得出結果后再join,且要從不同的運算階段輸出多個表,即使用也無法表達,只好將此業務邏輯拆分為多個作業,按順序提交,如此一來使得作業又復雜性能也不好。
  • 場景2
    當前Project有個數據表需要分享給多個團隊使用,考慮安全性做成了視圖, 視圖是通過一個算法模式實現。其他團隊發現此算法挺好也想用,但是底層訪問的數據表不一樣,一些模式識別的參數也不一樣,沒辦法只好再做一個新的視圖提供。若后續發現原來的視圖有bug,那么只能一個個的修復。

MaxCompute 提供的腳本模式與參數化視圖,基本解決了上述場景中的問題。

腳本模式

此文中采用MaxCompute Studio作展示,首先,,,建立一個新的MaxCompute腳本文件, 如下

image.png

注意,要選取MaxCompute Studio的腳本模式。這樣編譯器就會將整個文件作為一個整體編譯,而不是一個一個語句的編譯,提交的時候,也是整體提交。

觀察此腳本,可以看到其從多個表src, src1, src2讀取數據,中間可以做任意的filter, union, join等操作,最后輸出到多個表,dest和dest1中。多個語句以@開始的表變量連接。編譯后提交腳本運行,可以通過MaxCompute Studio的作業試圖察看執行計劃,如下:

image.png

右鍵點擊圖中任意task,彈出菜單點擊“expand all”,可以在一個視圖中看到執行計劃所有operator及其相互關系,如下:

image.png

可以看到雖然有多個語句,但是執行計劃是互相連通的一個DAG。這樣的執行計劃,用傳統的SQL語句,不管是CTE還是multi INSERT,都無法生成。一個執行計劃可以保證一次排隊,一次執行,充分利用了MaxCompute的資源。且書寫起來也更自然,只需要按照業務邏輯,用類似于普通編程語言的方式書寫,不用分心考慮如何組織語句,比如使用CTE和MULTI INSERT等,來優化性能。

同時,MaxCompute的優化器,比起多個語句分別執行,在腳本模式下能夠看到更完整的執行計劃,也就可以有更多的優化機會,生成全局最優的物理執行計劃,提高性能。

腳本模式也支持SET語句和部分DDL語句。例如:

image.png

一個腳本的完整形式是先SET語句,然后DDL語句,最后DML語句。每個部分都可以有0到多個語句,但是不同類型的語句不能交錯。

需要注意的是,在腳本模式下,如果一個表先被寫,又被讀可以领救济金的游戏,會報告錯誤,避免混淆。例如以下語句會報錯

insert overwrite table src2 select * from src where key > 0;
@a := select * from src2;
select * from @a;

建議您在書寫的時候,避免先寫后讀,例如以上腳本可以修改為:

@a := select * from src where key > 0;
insert overwrite table src2 select * from @a;
select * from @a;

這樣就可以打印出會寫入src2中的內容了。

腳本模式下目前還有一些限制

  • 一個腳本,目前最多支持一個屏顯語句,否則會報告錯誤。不建議在腳本中執行屏幕顯示的SELECT語句。
  • 一個腳本,目前最多支持一個CREATE TABLE AS語句并且必須是最后一句。我們推薦您將建表語句與INSERT語句分開寫,如上面提到的DDL和DML混合的腳本。

通過MaxCompute CMD使用腳本模式

腳本模式是一種新的模式,如果使用MaxCompute CMD來提交腳本,需要使用0.27以上的版本。建議您最新版本。安裝后,請使用新的 -s 參數來提交 。

如編輯腳本模式的源碼myscript.sql文件,調用odpscmd命令執行如下。

odpscmd -s myscript.mysql;

說明 -s 為odpscmd的命令行選項,類似于-f、-e,而非交互環境中的命令。odpscmd的交互環境中暫不支持腳本模式與表變量。

如果希望傳遞一些setting,但是又不想寫在腳本里面,可以按照如下的方,使用-e參數來單獨傳遞setting

odpscmd -e 'set odps.sql.setting1=a;odps.sql.setting2=b='-s myscript.sql

通過DataWorks使用腳本模式

在DataWorks中可以建立腳本模式的節點ODPS Script,如下圖所示。

image.png

在此節點中進行腳本模式編輯,編輯完成后單擊工具欄的運行按鈕,提交腳本到MaxCompute執行。從輸出信息的Logview URL中可以查看執行計劃圖和結果。

什么時候不應將多個小SQL語句組合為一個大模式腳本SQL

腳本模式能夠支持復雜的邏輯,一個腳本可以有很多行,編譯為一個執行計劃,這樣很容易將原來在多個SQL節點中的語句通過table variable銜接起來,拼裝為一個大的腳本模式SQL。但是,并不是所有場景都適合。

例如,如果上游數據來源于兩個每日更新的表,一個凌晨1點數據準備好可以领救济金的游戏,一個凌晨7點準備好,原來一個SQL節點1點的時候處理第一個數據,結果存為一個中間表。另一個SQL節點在7點的時候將此中間表和第二個數據源作進一步運算得到結果數據。這種場景就不適合將兩個節點中的SQL組合為一個大腳本。因為一個SQL節點本來可以更早的做好數據預處理,如果合成一個大腳本,就只能在7點所有數據都到達后生成一個作業,本來可以預處理的也要在大作業中完成,反而造成全鏈路E2E時間更長,出錯的概率也更高。

腳本模式更適合用來改寫本來要用層層嵌套子查詢的單個語句,或者因為腳本復雜性而不得不拆成多個語句的腳本。

參數化的視圖 (VIEW)

MaxCompute傳統的VIEW,可以封裝一段SQL腳本,底層的邏輯可以很復雜,比如訪問多個表,做復雜的運算,但是調用者可以像讀普通表一樣調用VIEW,不關心底層實現。這樣的VIEW實現了一定的封裝與重用,使用非常廣泛。

但是傳統的VIEW也有一個限制,就是不能接受任何調用者傳遞的參數。例如某個VIEW讀取一個底層表,希望調用者可以提供一個表對底層數據進行過濾,或者傳遞任何其他參數,這些需求傳統VIEW都不支持。如此便限制了傳統VIEW在代碼重用方面的能力,而開發中仍經常需要多次復制類似的代碼。

MaxCompute支持帶參數的VIEW,可以傳入任意表或者其他變量,定制VIEW的行為。

首先在MaxCompute建立一個新的MaxCompute腳本文件, 如下:

image.png

可以看到,pv有兩個參數,一個是表參數,一個是string參數,參數可以是任意的表或者基本類型。創建另一個腳本調用此VIEW,如下:

image.png

可以看到pv1可以用不同的參數調用,表參數可以是個物理表,view,表變量或者CTE中的表別名,普通參數可以是變量或者常量。

點擊此腳本的graph頁 (上圖中最下邊的紅框),可以看到此腳本對應的執行計劃:

image.png

可以看到,不管調用多少次,用什么樣的參數,MaxCompute編譯器都會將整個腳本編譯為一個執行計劃。

實際上,參數化VIEW不一定是一個SQL語句,也可以像腳本一樣,包含多個語句。例如:

image.png

其中BEGIN到END;之間的語句,就是這個VIEW的腳本。注意其中最后一句,@pv2 := ...,這個語句相當于是其他語言中的RETURN語句,方式為向一個與VIEW同名的隱含的表變量賦值。

在VIEW參數匹配的時候,實參和形參匹配的規則和普通語言一樣。如果可以隱式轉換,就可以匹配,例如bigint的值可以匹配類型為double的參數。表變量相對復雜一些,但是規則也很簡單,如果一個表的Schema,能夠用來插入到另一個表中,那也可以用來匹配同樣表Schema的表類型參數。

對于返回的類型,有的時候希望明確聲明,例如為了可讀性。可以明確地聲明返回類型,例如:

image.png

其中的RETURNS @ret TABLE (x string, y string), 定義了:

  • 返回類型為TABLE (x string, y string)。也就是返回給調用者的類型,注意可以在此定制表的Schema
  • 返回參數為@ret,在VIEW的腳本中對其賦值,就相當于返回。

實際上,對于沒有BEGIN/END和沒有返回變量的VIEW,都可以認為是這種形式的簡化形式。

在參數化VIEW的時候,對于腳本有一些其他限制。

  • 腳本中只能由DML語句,并且不能有INSERT與CREATE TABLE AS語句。
  • 腳本中不能有屏幕顯示語句。

最后,MaxCompute提供了新的腳本模式與參數化視圖,可以明顯提高開發者的編程效率,提高代碼的可重用性,與此同時,也提高了性能!我們推薦您盡量使用腳本模式和參數化視圖。

版權聲明:本文中所有內容均屬于阿里云開發者社區所有,任何媒體、網站或個人未經阿里云開發者社區協議授權不得轉載、鏈接、轉貼或以其他方式復制發布/發表。申請授權請郵件developerteam@list.alibaba-inc.com,已獲得阿里云開發者社區協議授權的媒體、網站,在轉載使用時必須注明"稿件來源:阿里云開發者社區,原文作者姓名",違者本社區將依法追究責任。 如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至:developer2020@service.aliyun.com 進行舉報,并提供相關證據,一經查實,本社區將立刻刪除涉嫌侵權內容。

分享:
阿里巴巴大數據計算
使用釘釘掃一掃加入圈子
+ 訂閱

阿里大數據官方技術圈

官方博客
鏈接
  • 官網:
  • 控制臺:
  • 線上實驗: