SQLFlow 是用於追溯資料血緣關係的工具,它自誕生以來以幫助成千上萬的工程師即使用者解決了困擾許久的資料血緣梳理工作。
資料庫中檢視(View)的資料來自表(Table)或其他檢視,檢視中欄位(Column)的資料可能來自多個表中多個欄位的聚集(aggregation)。 表中的資料可能通過ETL從外部系統中匯入。這種從資料的源頭經過各個處理環節,到達資料終點的資料鏈路關係稱為資料血緣關係(data lineage)。
SQLFlow 通過分析各種資料庫物件的定義(DDL)、DML 語句、ETL/ELT中使用的儲存過程(Proceudre,Function)、 觸發器(Trigger)和其他 SQL 指令碼,給出完整的資料血緣關係。
在大型資料倉庫中,完整的資料血緣關係可以用來進行資料溯源、表和欄位變更的影響分析、資料合規性的證明、資料質量的檢查等。
今日根據mysql的一個例項SQL進行進一步介紹該工具的具體操作:
示例語句:
MYSQL 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;
上述語句是通過一個複合查詢結果集建立一個臨時表,通過SQLFlow,我們可以清楚的分析複合查詢有哪些物件參與,每個物件分別有哪些欄位參與結果集,有哪些欄位參與物件間關聯。
- SQLFlow是怎麼樣工作的
SQLFlow通過自動分析SQL邏輯關係,能夠快速、準確的識別出SQL語句中各物件的關聯關係及每個物件參與運算的列名稱,如果存在多級運算,它的展示還包含各級的中間運算集合,讓你能夠清晰的閱讀,非常適合閱讀。
如下圖,淺綠色代表實體物件,紅色代表中間集合物件。
- 顯示SQL語句使用了哪些函式
當你在setting中勾選show function時,會將語句中所有用到的函式以灰色圖形展示,如下:
- 顯示物件間的關聯關係
下圖中虛線pseudorows是說明該結果集是邏輯(條件)運算而來的虛擬結果集,它作為一個標識,不是真正的列,下圖中高亮的黑虛線是下述語句中得來的,其中邏輯關係是dt ='2018-05-15' AND product_type='20288' ,所以這個pseudorows是由列dt和product_type一起運算而來,即我們看到的兩個虛線一起指向pseudorows。
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
- 血緣關係追蹤
從上面的sql中,進行我們的解析可以得到dim_day_txdate欄位來源於dmv.dim_day,a_pin來源於dwd.dwd_as_qy_cust_account_s_d,total_amount是 來源於DWD.dwd_actv_as_qy_iou_receipt_s_d中的(order_amt)經過sum之後得到amount 再通過sum和coleace操作得到的,這系列的血緣關係變化我們將用連結串列方式進行儲存,得到最終的血緣關係。
關於當前比較流行的SQLFlow工具是如何分析 mysql 語句,從而得到怎樣的表、欄位間的資料血緣關係 data lineage的內容就先分享到這裡,後續精彩繼續~~~