數據流分析軟體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