MLSQL 語法擴充套件設計
前言
MLSQL 語法非常簡單,只有:
- set
- select
- train/run/predict
- save
- load
等幾種語法。因為MLSQL為了簡單起見,對擴充套件新語法是非常牴觸的。比如,使用者很希望能檢視一張表的schema,在MLSQL中需要這麼用:
run command ShowTableExt.`tableName`;
比如殺一個任務,需要這麼用:
run command Kill.`jobId`;
雖然已然很簡單,但是使用者覺得還是不夠簡潔,使用者期待如下的表示方法:
show tableName; kill jobid;
但是如果加這些,就意味添加了新的語法,需要修改語法檔案。那如何簡單解決這個衝突呢?
解決方案
我們知道在MLSQL裡,ET是擴充套件性最好的東西,任何功能都可以通過ET來實現。MLSQL內部比如Python支援等也是通過ET實現的。ET對應的其實就是train/run/predict 三個關鍵字。前面的show table schema, kill job也是通過ET實現的。但是他的語法在簡單的場合確實不夠簡潔。 在不增加新語法的情況下,我們其實可以給一段程式碼片段重新命名從而實現新的功能。
比如前面的Kill,我們可以這樣做:
set kill = ''' -- 注意結尾沒有分號 run command Kill.`{}` ''';
接著,我們就獲得了一個新的命令,叫kill了,具體這麼使用:
!kill "groupid";
MLSQL 如果發現以!
開始,則認為是一個命令的開始,然後會尋找該命令的定義,然後執行對應的kill內容。以!
開始其實是受到Rust 的macro 呼叫的啟發,Rust 採用以!
結尾來區分巨集和普通方法的呼叫。MLSQL以!
開始作區分命令和其他指令碼指令的呼叫。
結束語
MLSQL 還提供了include語法,從而實現指令碼更好的複用。通過新的類似“巨集”的支援,可以讓指令碼獲得更好的複用性。不過這種複用性也讓指令碼更加複雜,使用者應當儘量不要使用而應該去使用系統提供了一些內建的“巨集”,比如 !desc 查看錶結構, !kill 殺任務等。