MLSQL如何幫助分析師更高效
前言
我之前寫過一篇文章叫如何按程式設計師思維寫分析師指令碼 ,這裡主要是在兩方面幫助分析師:
- 將程式設計師一些較為高效的工作模式轉移到分析師身上,這包括指令碼片段複用,指令碼include,工程專案,檢視等。
- MLSQL平臺提供這些思維的功能支援。
迄今為止,在之前文章提到的所有功能點,都已經在MLSQL中實現。當然,擁有這些還是遠遠不夠的,因為SQL語言自身的設計和用途上的限制,導致做很多事情還是會有點力有不逮,下部分內容我們會具體舉一個例子。
父子關係計算
父子關係計算指的是什麼呢?譬如有一張表,資料格式如下:
{"id":0,"parentId":null} {"id":1,"parentId":null} {"id":2,"parentId":1} {"id":3,"parentId":3} {"id":7,"parentId":0} {"id":199,"parentId":1} {"id":200,"parentId":199} {"id":201,"parentId":199}
這裡為了簡單,我們省略了其他欄位,只保留了id和parentId欄位。 一般而言這種結構建模了什麼呢? 我們舉個最簡單的例子,就是運營的拉新,一般而言現在大家喜歡用拉人頭模式,比如如果你邀請其他使用者註冊,你就能獲得獎勵,我們會建模這種關係,假設id是使用者id, parentId是邀請該使用者註冊的使用者。
對於後端研發而言,用這種關係表建模該模式是非常有效的。但是對於分析師而言,卻有點蛋疼了。比如要實現如下訴求:
- 計算拉新層級。我想知道任何一個使用者它的傳播層級有多少。比如A拉了B,B拉了C,那麼A的拉新層級就是2.
- 計算拉新數量。任一使用者的拉新使用者數(跨層級,也就是子使用者的子使用者的子使用者都算進去)
如果用SQL只能用join來實現有限層次的計算,而且SQL程式碼會很ugly,並且計算量還不小。本質上,對於需要遞迴的計算,SQL其實不是非常適合的。 那怎麼解決呢?
擴充套件SQL中的王者:ET
ET其實是MLSQL中 Estimator/Transformer裡的縮寫,我們借鑑了演算法領域的Estimator/Transformer的概念,來描述解決一個特定抽象問題的模組。該模組可以使用MLSQL的擴充套件語法來完成。 假設我們有一個ET解決了父子計算問題,它的名字叫TreeBuildExt
,怎麼在SQL中使用呢?
我們來看一個較為完整的示例:
-- 任何select SQL語句本質上都是一個Transformer,將原資料轉化為一個新的形態的資料。這裡,我們 -- 從originalTable 抽取了兩個欄位,並且將得到的新的SQL語句的結果命名為parentChildTable select id,parentId from originalTable as parentChildTable; -- 和傳統SQL語句不通的地方是我們新增了一個run關鍵字,和select類似,我們使用ET TreeBuildExt -- 對parentChildTable 進行處理,使用where條件語句設定處理他的條件 -- 處理後的結果,我們命名為result. run parentChildTable TreeBuildExt.`` where idCol="id" and parentIdCol="parentId" and treeType="nodeTreePerRow" as result; select * from result as output;
最後顯示的結果如下:
+---+-----+------------------+ |id |level|children| +---+-----+------------------+ |200|0|[]| |0|1|[7]| |1|2|[200, 2, 201, 199]| |7|0|[]| |201|0|[]| |199|1|[200, 201]| |2|0|[]| +---+-----+------------------+
該ET會計算每個元素的層級以及所有子元素。這樣分析師只要學會一個類似select語句的新statement,就能用一條語句完成以前很難完成的任務,是不是很酷?
研發可以開發非常多為分析師定製的ET模組,從而高效的提高分析師的工作效率,也讓很多”不可能“變成”可能“。值得一提的是,分析師做不了的工作,不需轉交給研發,而是由研發開發ET,從而然工作職責更加清晰,讓分析師的邊界更加寬廣。
總結
關於設定本地開發環境,可參看MLSQL 開發環境配置指南 。
關於ET具體開發指南,參看MLSQL-ET開發指南。
如果大家想體驗MLSQL產品,可點選一鍵體驗全套MLSQL產品 ,或者自助完成編譯部署。
更多內容請關注專題 以及MLSQL官方文件