數據流分析軟體SQLFlow的工作原理
- 2021 年 5 月 31 日
- 筆記
- data lineage, sqlflow, 血緣關係
SQLFlow是一個可視化的在線處理SQL對象依賴關係的工具,只需要上傳你的SQL腳本,它可以自動分析SQL里的數據對象,包括database、schema、table、view、column、procedure、function、trigger等等,並且能夠分析這些數據對象之間的依賴關係,並將這些依賴關係可視化展現出來。本文將描述SQLFlow的工作原理。
SQLFlow底層主要是依賴GSP Parser來完成SQL的處理,按照處理順序從前到後依次為: 數據源連接、Metadata數據導出、SQLEnv初始化、SQL語法解析、SQL語法分析、DataFlow關係分析、DataFlow序列化輸出。
考慮下面這個SQL:
CREATE TABLE tmp.tmp_a_supp_achievement_an_mom_001 AS SELECT a1.dim_day_txdate, a.a_pin, Sum(Coalesce(b.amount, 0)) AS total_amount , Sum(Coalesce(c.refund_amt, 0)) AS refund_amt , Sum(os_prcp_amt) os_prcp_amt FROM (SELECT dim_day_txdate FROM dmv.dim_day WHERE dim_day_txdate>=concat(cast(Year('2018-05-15')-1 AS string),'-', substring('2018-05-15', 6, 2), '-01') AND dim_day_txdate<='2018-05-15' )a1 JOIN (SELECT DISTINCT a_pin, product_type FROM dwd.dwd_as_qy_cust_account_s_d WHERE dt ='2018-05-15' AND product_type='20288' )a LEFT OUTER JOIN (SELECT substring(tx_time, 1, 10) AS time, sum(order_amt) AS amount, a_pin FROM dwd.dwd_actv_as_qy_iou_receipt_s_d WHERE a_order_type='20096' AND a_pin NOT IN ('vep_test', 'VOPVSP測試') AND dt='2018-05-15' GROUP BY substring(tx_time, 1, 10), a_pin )b ON cast(a.a_pin AS string)=cast(b.a_pin AS string) AND a1.dim_day_txdate=b.time LEFT OUTER JOIN ( SELECT substring(refund_time, 1, 10) AS refund_time, a_pin, sum(refund_amt)AS refund_amt FROM dwd.dwd_as_qy_iou_refund_s_d WHERE refund_status='20090' AND dt='2018-05-15' AND a_order_no <> '12467657248' AND a_refund_no <> '1610230919767139947' GROUP BY substring(refund_time, 1, 10), a_pin )c ON cast(a.a_pin AS string)=cast(c.a_pin AS string) AND a1.dim_day_txdate=c.refund_time LEFT OUTER JOIN (SELECT dt, a_pin, sum(os_prcp_amt) AS os_prcp_amt FROM dwd.dwd_as_qy_cycle_detail_s_d WHERE dt>=concat(substr('2018-05-15', 1, 7), '-01') AND dt<='2018-05-15' GROUP BY dt, a_pin)e ON cast(a.jd_pin AS string)=cast(e.a_pin AS string) AND a1.dim_day_txdate=e.dt GROUP BY a1.dim_day_txdate, a.a_pin;
可以看到,Table tmp.tmp_a_supp_achievement_an_mom_001 的創建依賴一個子查詢語句,而子查詢的結果集中包含了function,並且子查詢的from table,又包含了一個複雜的子查詢語句,並且還有join依賴關係,join中也有一個子查詢語句。因此這是一個多層子查詢的嵌套語句。
因此,我們可以分析得出,在處理SQL依賴關係的時候,需要建立一個stack,進行深度遍歷,一層層的分析SQL依賴關係,最後出棧的時候,再將各層依賴關係連接起來,形成一個依賴關係調用鏈。
實際上的分析過程是,優先分析SQL中的Table,看其是否有子查詢,如果有則繼續向下繼續分析子查詢。然後再分析查詢結果集,將結果集中的欄位和Table欄位一一關聯起來。如果結果集中包含Function,還需要對Function進行進一步的解析,形成Function和內部欄位的依賴關係。
SQLFlow官方入口: //sqlflow.gudusoft.com