大数据开发的常见实践:把 SQL 直接写在 Shell 脚本里 ER图 数据血缘

在Shell脚本中直接嵌入SQL(如hive -ebeeline -e)是大数据开发的常见实践,尤其适合凌晨定时跑批任务。


其优势包括:

  1. 与Crontab无缝集成,简化调度;
  2. 动态参数化,通过Shell变量灵活拼接SQL(如日期分区);
  3. 流程控制与异常处理,可串联多个SQL并拦截错误;
  4. 混合编程,轻松结合Python脚本进行数据校验。

ER图是数据库的"建筑蓝图",通过实体(表)、属性(字段)和关系(关联)直观展示数据模型,帮助开发者快速理解业务逻辑、编写正确SQL及设计校验规则。


数据血缘记录数据的全生命周期流转路径,分为系统级、表级和字段级,核心价值在于:

  1. 快速定位数据异常
  2. 评估变更影响
  3. 满足金融合规审计

三者共同提升开发效率与数据治理能力。

把 SQL 直接写在 Shell 脚本里


在大数据开发中,把 SQL 直接写在 Shell 脚本里(通常是通过 hive -e "SQL语句"beeline -e "SQL语句" 的方式),其实是一种非常经典且实用的做法。

结合你平时处理凌晨定时跑批任务的工作模式,这种写法主要有以下几个非常现实的好处:

1. 方便结合系统级调度(如 Crontab)

虽然你们有袋鼠云(Kangaroo)这样的可视化调度平台,但在很多底层运维或轻量级任务中,Linux 自带的 Crontab 依然是主力。

把 SQL 写在 Shell 里,意味着你可以直接把这个脚本交给 Crontab 去执行。比如每天凌晨 2 点,Crontab 触发 Shell 脚本,Shell 脚本里直接连着执行好几条 Hive SQL,一气呵成,不需要额外去调度平台配置复杂的依赖关系。

2. 极强的灵活性(参数化与动态拼接)

这是 Shell 脚本最大的优势。在跑批时,你经常需要处理动态变化的日期或分区。

在 Shell 里,你可以轻松获取系统时间,并把它作为变量传给 SQL。例如:

bash

复制代码
1# 获取昨天的日期
2yesterday=$(date -d "yesterday" +%Y-%m-%d)
3
4# 直接把变量拼接到 SQL 里执行
5hive -e "INSERT OVERWRITE TABLE target_table PARTITION(dt='${yesterday}') SELECT * FROM source_table WHERE dt='${yesterday}';"

这种动态传参在纯 SQL 文件里实现起来会比较麻烦,但在 Shell 里就是几行代码的事。

3. 方便做流程控制和异常处理

凌晨的定时任务最怕的就是"静默失败"。如果只跑一个 SQL 文件,很难在中间加逻辑判断。

但在 Shell 脚本里,你可以把多个 SQL 串联起来,并加上严格的判断逻辑:

bash

复制代码
1# 执行第一步 SQL
2hive -e "CREATE TABLE IF NOT EXISTS temp_table ..."
3# 检查上一步是否成功
4if [ $? -ne 0 ]; then
5    echo "建表失败,脚本退出"
6    exit 1
7fi
8
9# 成功后再执行第二步
10hive -e "INSERT INTO ..."

这样如果中间某一步出错,脚本会立刻停止并报错,方便你第二天早上排查问题,而不是等所有任务跑完才发现数据是错的。

4. 方便结合 Python 脚本做数据校验

你平时也会用 Python (PyHive) 写数据校验脚本。在 Shell 里,你可以非常方便地把 SQL 执行和 Python 校验串联起来:

bash

复制代码
1# 1. 先跑 Hive SQL 生成数据
2hive -e "INSERT OVERWRITE TABLE ..."
3
4# 2. 跑完立刻调用 Python 脚本校验数据量或金额
5python3 /path/to/your/validation_script.py
6
7# 3. 根据 Python 脚本的返回结果决定是否继续

这种"SQL + Python + Shell"的混合双打,是保障凌晨跑批数据质量的黄金组合。


总结:

把 SQL 写在 Shell 里,本质上是为了把"数据处理逻辑(SQL)"和"流程控制逻辑(Shell)"结合起来。它让你能更灵活地处理动态参数、串联多个任务、做异常拦截,以及无缝对接 Linux 系统的定时任务。

不过,如果 SQL 逻辑特别复杂(比如几百行的存储过程),直接写在 Shell 里会变得很难维护。这时候通常会把 SQL 单独抽离成一个 .sql 文件,然后在 Shell 脚本里通过 hive -f script.sql 的方式去调用它。


ER图


ER图,全称是 实体-关系图(Entity-Relationship Diagram)。简单来说,它就是数据库表结构的"建筑蓝图",用来直观地展示系统里有哪些数据表、表里有哪些字段,以及这些表之间是怎么相互关联的。

对于数据开发来说,看懂 ER 图是接手新业务、梳理底层数据模型的第一步。它主要由三个核心部分组成:

1. 实体(Entity)------ 对应"表"

实体代表现实世界中可以独立存在的事物。在数据库里,一个实体通常就对应一张数据表

  • 举例: 在银行业务中,"客户"、"账户"、"交易流水"都是实体。

2. 属性(Attribute)------ 对应"字段"

属性是用来描述实体特征的。在数据库里,它对应表里的字段(列)

  • 举例: "客户"这个实体,会有"客户ID"、"姓名"、"身份证号"等属性。

3. 关系(Relationship)------ 对应"表关联"

关系描述了实体之间的业务联系。在数据库里,这通常通过外键或 JOIN 条件来实现。常见的关系有三种:

  • 一对一(1:1): 比如一个"客户"对应一个"身份证信息"。
  • 一对多(1:N): 比如一个"客户"可以有多笔"交易流水"。
  • 多对多(M:N): 比如"用户"和"角色",一个用户可以有多个角色,一个角色也可以分配给多个用户(通常会通过一张中间表来拆解)。

为什么数据开发需要看 ER 图?

结合你平时做数据开发和写 Hive SQL 的工作模式,ER 图的作用非常直接:

  1. 快速搞懂业务逻辑: 当你接手一个新的业务模块(比如反洗钱或大额交易上报),面对几十张陌生的表,直接看 ER 图能帮你迅速理清"客户表"和"交易表"是怎么通过客户号关联起来的,比直接翻代码快得多。
  2. 写 SQL 的"导航图": 在写复杂的关联查询时,ER 图能清晰地告诉你该用哪个字段做 JOIN,避免写出笛卡尔积或者关联错误的 SQL。
  3. 数据校验的参考: 你平时会用 Python 写脚本做数据校验,ER 图里的约束关系(比如主外键、唯一性)能帮你快速确定校验逻辑和预期结果。

总结一下:

ER 图就是用图形化的方式,把数据库里"表与表之间的关系"画出来。它是数据开发人员理解业务模型、设计数仓分层以及编写复杂 SQL 时必不可少的"地图"。


数据血缘


数据血缘(Data Lineage),简单来说,就是数据的"族谱"或"履历表"。它完整记录了数据从产生、处理、加工、流转,一直到最终被消费或销毁的整个生命周期。

在数据开发语境下,它清晰地回答了三个核心问题:

  1. 数据从哪来?(源头是业务系统还是外部文件?)
  2. 中间经过了什么?(经过了哪些 ETL 脚本、Hive SQL 或 Python 脚本的加工?)
  3. 最终流向了哪里?(变成了哪张报表或哪个下游模型?)

结合你日常在银行做大数据开发的工作模式,数据血缘通常分为三个层级:

1. 数据血缘的三个层级

  • 系统级血缘: 宏观视角,看数据从哪个源系统(如核心交易系统)流向了哪个目标系统(如数仓或反洗钱系统)。
  • 表级血缘: 中间视角,看数仓里的某张目标表(如 DWD 层交易表)是由哪些源表(如 ODS 层流水表)经过关联和清洗生成的。
  • 字段级血缘: 最精细的视角。比如目标表里的"交易金额"字段,是由源表的哪几个字段经过加减乘除或聚合计算得来的。

2. 数据血缘对日常开发的核心价值

  • 快速排查凌晨跑批异常: 你平时负责凌晨的定时调度任务,如果第二天早上发现某张报表数据对不上,有了字段级血缘,就能顺着图谱一层层往上追溯,精准定位是上游源数据录入错了,还是中间某段 Hive SQL 的逻辑写错了,不用再去盲猜。
  • 变更前的影响分析: 当你需要修改某张底层表的字段,或者调整反洗钱规则模型的逻辑时,可以通过血缘的"下游依赖"功能,提前看到这个字段被哪些下游报表或监管报送任务引用,避免改了一处导致下游大面积报错。
  • 满足金融合规与审计要求: 银行对数据的准确性和可追溯性要求极高。数据血缘能清晰展示数据的来龙去脉,在面对内外部审计时,提供强有力的数据质量保障证据。

总结一下:

数据血缘就像是数据开发中的"高德地图"。它把你日常编写的各类 SQL 脚本、Python 校验脚本以及调度任务串联成一张可视化的网络,让你对数据的流转路径一目了然,极大提升了问题排查和系统维护的效率。

相关推荐
川石课堂软件测试5 小时前
安全测试|常见SQL注入攻击方式、实例及预防
服务器·数据库·sql·功能测试·测试工具·安全·单元测试
qq_366086227 小时前
sql 查询中关于 null 值判断的问题
数据库·sql
金伟API102410 小时前
常见的SQL面试题:经典50例
数据库·人工智能·笔记·sql·学习
凤山老林13 小时前
数据库连接池深度调优:Spring Boot + HikariCP 泄漏检测、参数调优与慢 SQL 拦截体系
数据库·spring boot·sql
Csvn1 天前
📊 SQL 入门 Day 7:子查询 — 查询中的查询
后端·sql
OneNobody1 天前
Spark SQL AQE工作原理源码剖析
大数据·sql·spark
kali-Myon1 天前
深入 MySQL 内核:从临时哈希表分配机制详解 Floor 报错注入核心原理
数据库·sql·mysql·安全·web
梦想画家1 天前
用SQL驱动AI:Trino AI Functions跨源情报分析实战指南
sql·ai·trino
Csvn2 天前
📊 SQL 入门 Day 6:多表查询 — JOIN 的四种姿势
后端·sql