1. 程式人生 > >如何按程式設計師思維寫分析師指令碼

如何按程式設計師思維寫分析師指令碼

前言

今天無意在在某群裡,看到一個很複雜的SQL指令碼,join很多,子查詢很多,union很多,case when也很多。然後就讓我們負責分析師指令碼管理的同事給我看了下我們分析師的指令碼,我發現隨便一個竟然都超了三四百行。這指令碼維護起來應該是個噩夢。如果要讓一個東西好維護,好管理,那一定需要專案化,如何專案化一個指令碼呢?

這個其實很像前端,原先前端就是一個html頁面,有html,javascript,css等,然後一開始大家就是在一個頁面寫完所有邏輯,後面出現了Vue,react等框架,把前端單一頁面開發專案化了。我們知道,表現層的東西是多變的,難以複用的,比如html程式碼片段就比較難以複用。同樣的,SQL具有很強的表達能力,以及比程式語言更低的使用門檻,但是複用難度也是比較大的。不過你願意,總是可以的。

設計

針對前面的問題,我設計了一套專案體系,可以讓分析師以較為結構化和專案化的思維去完成一個指令碼的編寫。當然,這個是執行在我們內部的Skone系統之上的,底層的DSl語法則是MLSQL,引擎是StreamingPro。

專案目錄結構為如下:

1063603-570301c66d4f3ae9.png image.png

這是A分析師的一個專案目錄,叫analyser。 裡面分成了四個子目錄。

  1. function 可以複用指令碼片段,如果分析師還會寫python,則包含udf函式。
  2. entity_tables 分析師使用到的落地中間表。
  3. virtual_tables 分析師使用到的虛擬中間表。
  4. job 分析師任務指令碼集合,一個job就是完成一個功能點,比如出一張報表。

function

我們先來看function目錄:

1063603-f5ebfafc2dfd58e2.png image.png

裡面包含兩種型別的的可複用指令碼。第一個是SQL程式碼片。比如上圖裡的,我們經常會反覆用一個case when,這個時候就可以抽象成一個程式碼片段。其實說白了就是做了個名字對映。

使用時,可以這樣:

1063603-4fb12fb7bfe68b67.png image.png

另外一個就是如果分析師會一些指令碼,那麼可以整理自己一些常用的函式庫。

1063603-e0a0663700021056.png image.png

使用時可以這樣:

1063603-9627cae49f7c6212.png image.png

virtual_tables

我們知道,在分析師實際寫指令碼的時,往往為了完成一個結果,會需要產生大量的中間表,不同的job可能會有依賴同一批中間表。virtual_tables目錄使得分析師可以統一管理自己的經常使用的中間表。

1063603-f4ab6c6cd3b18251.png image.png

這張圖例,就是產生了一張表明為 vistor_count_from_three_channes的表。

job

job 目錄則是分析師真正完成工作的地方。通常,分析師會include function/virtual_tables裡函式或者表在最終job裡使用,比如:

1063603-2a7c90c36e49636c.png image.png

這個過程,分析師匯入了votes表,shares表,然後union 了他們,最後追加到hive表裡。

總結

通過這套體系,強化了分析師們的抽象和複用能力,也簡化了指令碼複雜度。分析師自己就很方便構建常用的虛擬表集合,對於經常用到的一些處理邏輯,也可以進行很好的封裝。而如果分析師熟悉python指令碼,也能更好的進行自主開發。

我們還可以讓分析師把專案一鍵傳送給數倉工程師,讓他們完成最後的上線過程。