大数据血缘主要体现在表与表之间的关系,描述了我的数据从哪里来,经过怎样的关联处理,流到哪里去,弄清楚关系是做数据治理的关键一环。
大数据中涉及的数据表成百上千,表与表之间的关系,交叉依赖,错中复杂的。
今天我们从一个简单的SQL开始,去构建血缘关系及可视化。SQL查询客户的销售额,并将数据写入表table_user_dt_tg中:
血缘关系解析图谱:
关键血缘分析
1. 目标表结构
2. 分区策略
-
-
分区值来源:硬编码值'20250216'(通过WHERE条件过滤)
-
3. 字段级血缘
-
-
-
验证路径:JOIN条件s1.user_id = s2.user_id
-
-
聚合操作可能导致精度损失(需确认业务是否需要保留明细)
有了血缘数据之后,我们请能清楚的看出 数据的流向以及使用哪些字段,做了哪些计算统计等,数据治理才有了抓手。比如基于血缘数据分析。可以评估出S QL存在的风险点以及优化建议。
SQL质量风险点
-
分区陷阱:WHERE条件将s2.dt固定为20250216,但目标表分区字段dt来自s2.dt,导致所有数据写入dt='20250216'分区
-
LEFT JOIN实效性:WHERE条件在JOIN之后执行,实际将LEFT JOIN转换为INNER JOIN效果
-
GROUP BY冗余:group by包含s2.dt,但该字段已被WHERE条件固定为常量。
优化建议
动态分区改造(如需多分区写入):
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
-- 移除WHERE条件中的dt过滤
JOIN条件优化:
LEFT JOIN table_order_source2 s2
ON s1.user_id = s2.user_id
AND s2.dt = '20250216' -- 将过滤条件移到JOIN条件中
字段精简:
GROUP BY
s1.user_id, -- s2.dt已是常量,可移除
s1.user_name,
s2.order_id
以上就是一个基于数据血缘,做数据治理的经典案例了。