在Shell脚本中直接嵌入SQL(如
hive -e或beeline -e)是大数据开发的常见实践,尤其适合凌晨定时跑批任务。
其优势包括:
- 与Crontab无缝集成,简化调度;
- 动态参数化,通过Shell变量灵活拼接SQL(如日期分区);
- 流程控制与异常处理,可串联多个SQL并拦截错误;
- 混合编程,轻松结合Python脚本进行数据校验。
ER图是数据库的"建筑蓝图",通过实体(表)、属性(字段)和关系(关联)直观展示数据模型,帮助开发者快速理解业务逻辑、编写正确SQL及设计校验规则。
数据血缘记录数据的全生命周期流转路径,分为系统级、表级和字段级,核心价值在于:
- 快速定位数据异常;
- 评估变更影响;
- 满足金融合规审计。
三者共同提升开发效率与数据治理能力。
把 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 图的作用非常直接:
- 快速搞懂业务逻辑: 当你接手一个新的业务模块(比如反洗钱或大额交易上报),面对几十张陌生的表,直接看 ER 图能帮你迅速理清"客户表"和"交易表"是怎么通过客户号关联起来的,比直接翻代码快得多。
- 写 SQL 的"导航图": 在写复杂的关联查询时,ER 图能清晰地告诉你该用哪个字段做 JOIN,避免写出笛卡尔积或者关联错误的 SQL。
- 数据校验的参考: 你平时会用 Python 写脚本做数据校验,ER 图里的约束关系(比如主外键、唯一性)能帮你快速确定校验逻辑和预期结果。
总结一下:
ER 图就是用图形化的方式,把数据库里"表与表之间的关系"画出来。它是数据开发人员理解业务模型、设计数仓分层以及编写复杂 SQL 时必不可少的"地图"。
数据血缘
数据血缘(Data Lineage),简单来说,就是数据的"族谱"或"履历表"。它完整记录了数据从产生、处理、加工、流转,一直到最终被消费或销毁的整个生命周期。
在数据开发语境下,它清晰地回答了三个核心问题:
- 数据从哪来?(源头是业务系统还是外部文件?)
- 中间经过了什么?(经过了哪些 ETL 脚本、Hive SQL 或 Python 脚本的加工?)
- 最终流向了哪里?(变成了哪张报表或哪个下游模型?)
结合你日常在银行做大数据开发的工作模式,数据血缘通常分为三个层级:
1. 数据血缘的三个层级
- 系统级血缘: 宏观视角,看数据从哪个源系统(如核心交易系统)流向了哪个目标系统(如数仓或反洗钱系统)。
- 表级血缘: 中间视角,看数仓里的某张目标表(如 DWD 层交易表)是由哪些源表(如 ODS 层流水表)经过关联和清洗生成的。
- 字段级血缘: 最精细的视角。比如目标表里的"交易金额"字段,是由源表的哪几个字段经过加减乘除或聚合计算得来的。
2. 数据血缘对日常开发的核心价值
- 快速排查凌晨跑批异常: 你平时负责凌晨的定时调度任务,如果第二天早上发现某张报表数据对不上,有了字段级血缘,就能顺着图谱一层层往上追溯,精准定位是上游源数据录入错了,还是中间某段 Hive SQL 的逻辑写错了,不用再去盲猜。
- 变更前的影响分析: 当你需要修改某张底层表的字段,或者调整反洗钱规则模型的逻辑时,可以通过血缘的"下游依赖"功能,提前看到这个字段被哪些下游报表或监管报送任务引用,避免改了一处导致下游大面积报错。
- 满足金融合规与审计要求: 银行对数据的准确性和可追溯性要求极高。数据血缘能清晰展示数据的来龙去脉,在面对内外部审计时,提供强有力的数据质量保障证据。
总结一下:
数据血缘就像是数据开发中的"高德地图"。它把你日常编写的各类 SQL 脚本、Python 校验脚本以及调度任务串联成一张可视化的网络,让你对数据的流转路径一目了然,极大提升了问题排查和系统维护的效率。