中国石油笔记

数据架构:数据源的注册,物理模型的设计

结束之后,才能在数据工厂进行数据的编排。数据工厂完全基于数据模型来集成作业的配置

以上可能没多大用

初始

点击+号,可创建目录,可在目录下创建集成作业,点击目录,在右侧会出现目录下的那些已有集成作业

点击新建作业,打开如图界面

数据类型:结构化:有固定表结构的数据

非结构化:没有固定表格结构的数据。比如图片、PDF、word、excel、视频、音频

集成类型:多表

单表

集成方式:批处理

流处理

结构化数据在迁移系统里怎么用?

比如你要把源库的一张表:source_well_info

迁移到目标库:target_well_info

源表字段:

源字段 含义
well_no 井号
well_name 井名
oilfield 油田

目标表字段:

目标字段 含义
well_id 井ID
name 井名称
oilfield_name 油田名称

那迁移系统里就会配置字段映射:

source_well_info.well_no → target_well_info.well_id

source_well_info.well_name → target_well_info.name

source_well_info.oilfield → target_well_info.oilfield_name

对应 SQL 思维就是:

sql 复制代码
select
  well_no as well_id,
  well_name as name,
  oilfield as oilfield_name
from source_well_info;

非结构化数据迁移是什么?

非结构化迁移通常不是"字段映射",而是"文件搬运"。

比如:

从 A 文件服务器

迁移到 B 文件服务器

或者:

从源系统的附件目录

迁移到目标系统的对象存储 / 文件系统

它关心的可能是:

文件路径

文件名

文件大小

文件类型

创建时间

所属业务ID

举个例子:

file_id file_name file_path business_id
F001 井场照片.jpg /upload/2024/01/a.jpg W001
F002 生产日报.pdf /upload/2024/01/b.pdf W002

这里有两层:

第一层,文件本身:

井场照片.jpg

生产日报.pdf

这是非结构化数据。

第二层,文件的登记信息:

file_id

file_name

file_path

business_id

这是结构化数据。

所以实际项目里经常是:

结构化数据 + 非结构化附件 一起迁移

比如迁移一口井的信息,同时迁移这口井相关的照片、PDF、附件。


集成类型:单表

  1. 什么是单表?

单表就是这次迁移只处理一张源表到一张目标表。

比如:

源表:well_info

目标表:t_well_info

只从一张源表取数据,不需要关联其他表。

例子:

sql 复制代码
select
  well_id as id,
  well_name as name,
  oilfield_name as oilfield,
  status as state
from well_info;

这里就只有一张表:well_info

这种就是单表集成 / 单表迁移

单表适合什么情况?

适合字段基本都在一张表里的情况。

比如源表已经很完整:

well_id well_name oilfield_name status create_time
W001 1号井 高升油田 正常 2024-01-01
W002 2号井 高升油田 停产 2024-01-02

目标表也只是换一下字段名:

id name oilfield state created_at

那就可以单表迁移:

sql 复制代码
select
  well_id as id,
  well_name as name,
  oilfield_name as oilfield,
  status as state,
  create_time as created_at
from well_info;

这就是最简单、最适合新手先掌握的迁移方式。

集成类型:多表

  1. 什么是多表?

多表就是这次迁移需要从多张源表取数据,经过关联、拼接、转换后,写入目标表。

比如目标表需要这些字段:

目标字段 来源
well_id 井基础表
well_name 井基础表
oilfield_name 油田表
daily_oil 日产表
prod_date 日产表

这些字段不在一张表里。可能来自三张表,那就需要多表关联。

多表集成通常要写 join

比如:

sql 复制代码
select
  a.well_id as well_id,
  a.well_name as well_name,
  c.oilfield_name as oilfield_name,
  b.prod_date as prod_date,
  b.daily_oil as daily_oil
from well_info a
inner join production_daily b
  on a.well_id = b.well_id
inner join oilfield_info c
  on a.oilfield_id = c.oilfield_id;

集成方式:批处理

  1. 什么是批处理?

批处理就是按照某个时间点或周期,一批一批地搬数据。

比如:每天凌晨 2 点跑一次

每小时跑一次

手动点执行一次

一次迁移昨天的数据

一次迁移某个月的数据

它不是数据一变化就马上同步,而是按批次处理。

集成方式:流处理

什么是流处理?

流处理就是数据一产生、一变化,就尽快同步或处理。适合对实时性要求高的场景。

名称 你可以怎么理解 典型例子
结构化 数据库表,有行有列 井信息表、日产表、组织机构表
非结构化 文件,没有固定行列 图片、PDF、Word、视频、附件
单表 只从一张表取数据 well_info → t_well
多表 多张表关联后取数据 日产表 join 井表 join 油田表
批处理 一批一批处理 每天凌晨同步昨天数据
流处理 来一条处理一条 设备实时数据、实时报警

当前版本

不用填写

五层数据

这五个选项:数据源头、贴源层、共享层、分析层、应用层,不是普通数据库名字,而是数据平台里的"五个数据层级"。

数据通常从下往上流动:

数据源头 → 贴源层 → 共享层 → 分析层 → 应用层

教程选的是:

源端:共享层

目标端:分析层

意思就是:

从"已经标准化、可复用的公共数据"里取数据,再加工成"面向分析场景的数据"。

数据层级 类比做饭 数据状态
数据源头 菜市场、原材料产地 最原始的数据
贴源层 把菜买回来,原样放进厨房 尽量保持原样的数据
共享层 洗菜、切菜、去重、统一标准 标准化、可复用的数据
分析层 按菜谱加工成半成品菜 面向分析主题的数据
应用层 最终端上桌的菜 给具体系统、报表、页面用的数据
数据源头

数据源头就是数据最开始产生的地方。

比如油田业务里,数据可能来自:

生产系统,井控系统,设备采集系统,作业管理系统

这些系统就是"数据源头"。

举个例子:某个采油厂每天在业务系统里录入日产数据:

这个数据最开始是在业务系统里产生的,那么那个业务系统就是数据源头

数据源头一般有这些特点:

原始,分散,格式不统一,字段命名不统一,质量不一定好,可能有脏数据,可能来自不同厂商系统

比如不同系统里,井号可能叫:well_id,well_no,jh

同一个含义,不同系统字段名不一样。

这就是为什么后面要有贴源层、共享层、分析层。

贴源层

贴源层可以理解成:

把数据源头的数据,尽量原样复制一份到数据平台里。

也就是说,源系统里字段是什么样,贴源层尽量就是什么样。

贴源层主要做:抽取源数据,保留原始字段,保留原始记录,少量清洗,增加采集时间、批次号等技术字段

为什么不直接从数据源头进共享层或分析层?

原因是:要保留原始数据,方便追溯。

比如后面分析结果错了,你需要查:到底是源系统数据就错了?还是贴源时错了?还是共享层清洗错了?还是分析层加工错了?

共享层

共享层是把贴源层的数据清洗、统一、标准化之后,形成大家都能复用的数据。

共享层解决什么问题

比如不同源系统里都有"井"的信息:同一个东西,字段名和写法都不一样。共享层要把它统一成标准形式

为什么叫"共享层"

因为它不是只服务某一个报表或某一个应用。

它可以被多个下游使用:分析层可以用,应用层可以用,报表可以用,接口可以用,其他项目也可以用

分析层

分析层是面向具体分析主题加工出来的数据。

从共享层到分析层会发生什么

共享层里可能有很多标准表:分析层会根据某个分析目的,把这些表组合起来。

例如,要做"单井日产分析",目标表可能需要:

字段 来源
well_id 井基础表
well_name 井基础表
oilfield_name 油田表
plant_name 组织机构表
prod_date 日产表
daily_oil 日产表
daily_water 日产表
water_cut 计算字段

SQL 思路可能是:

sql 复制代码
select
  a.well_id,
  b.well_name,
  c.oilfield_name,
  d.plant_name,
  a.prod_date,
  a.daily_oil,
  a.daily_water,
  case 
    when a.daily_liquid = 0 then null
    else a.daily_water / a.daily_liquid
  end as water_cut
from shared_production_daily a
inner join shared_well_info b
  on a.well_id = b.well_id
inner join shared_oilfield_info c
  on b.oilfield_id = c.oilfield_id
inner join shared_org_info d
  on b.org_id = d.org_id;
应用层

应用层就是最终给具体应用、页面、接口、报表使用的数据。

表映射

哪张源表的数据要写到哪张目标表

字段映射

一般点进"详细配置"后,会配置:

源字段 → 目标字段

比如:

WELL_ID → WELL_ID

WELL_NAME → WELL_NAME

PROD_DATE → STAT_DATE

DAILY_OIL → OIL_QTY

共享层转分析层案例

如图,选择共享层的一个库,分析层的一个库,然后把源端库和目标库连线。

源端一些数据集的名字会变得加粗,是因为源库和目标库有同名的表,点击猜一猜就会连线,但连线有时看得不清晰,所以右侧表映射可以较清楚地看出。

疑惑:但是你看这个图里,选择共享层和分析层,那我的理解就是共享层数据是存在的,分析层数据是不存在的,可是如图这个图里,为什么会共享层和分析层连接起来的两个库下面有很多同名数据集

解答:

共享层和分析层下面出现很多同名数据集很正常,因为它们不是同一个东西。

左边是:

共享层 / chl-mysql / 源表

右边是:

分析层 / chl-Doris / 目标表

表名一样,只代表系统可能在做:

共享层的表 → 分析层的同名表

目标端分析层下面有同名数据集,通常说明:

  1. 目标表结构已经提前建好了;

  2. 系统自动按源表名生成了目标表名;

  3. 之前可能已经同步过,所以目标表也存在;

  4. 同名不代表里面一定有数据。

关键区别是:

表存在 ≠ 表里有数据。

要判断分析层表里有没有数据,要看数据预览或执行:

复制代码
select count(*)
from 目标表;

所以你的理解要改成:

共享层是这次读取数据的源端,分析层是这次写入数据的目标端。目标端可以提前有同名表,用来接收同步/迁移后的数据。

映射

如果有不是同名的也想做映射,把同名映射连线删除,把想做映射的两个数据源连线

详情配置

源端策略

加一些统一的查询条件,新增条件-生成脚本,如果所有原表都有update_date字段,可以写一个统一的查询条件,就会新增一个where条件加在原表所有select语句后面

还可以新增源字段

即所有表都必须有的字段

目标端策略

1.目标字段统一处理

2.插入更新配置

3.统一新增删除条件(选择删除后插入的情况可使用)

先执行delete操作,把符合条件的数据删除,然后再执行源端数据插入目标端数据的操作

运行策略

调度策略

需要周期性调度就必须勾选-周期性调度生效

秒、分钟、小时、天、月、年,可以联动设置。例:在日里设置:从1号开始,每1日执行一次,此时默认每天0:00执行,可去小时里指定1和5(可多选),就变成了每天1:00和5:00执行一次。

所有的配置完后点击保存

来到这个界面,每个作业名称后面的数字就代表这个作业下面有几个表,多张表就是多表作业

打开3张表的作业如图

单表模式

某些场景,源表和目标表是异构的,做字段映射,这时候就用到单表模式

新建作业

单表模式,源端和目标端就都只能选一张表。先在源端选择一张表,点击设为源,再在目标端选择一张表,点击设为目标

字段不想做映射可以点击连线删掉,可以通过拉线的方式给不同名的字段作映射

详情设置-源端策略

全量和增量

在数据迁移/数据同步里,全量增量是在问:

这次从源表里取多少数据?


1. 全量是什么意思

全量 = 每次都把源表所有数据都取出来。

比如源表 X_TP_ACH_DST 里有 100 万条数据。

选择全量时,任务每次执行都会读:

复制代码
select *
from X_TP_ACH_DST;

也就是:

复制代码
不管这些数据以前有没有同步过,都重新取一遍。

全量适合什么情况

适合:

复制代码
第一次迁移
数据量不大
目标表需要整体重刷
源表没有更新时间字段
不方便判断哪些是新增/修改数据

比如第一次把 MySQL 的表同步到 Doris,通常会先跑一次全量。


2. 增量是什么意思

增量 = 只取新增或变化的数据。

比如昨天已经同步过 100 万条,今天源表新增/修改了 500 条。

选择增量时,任务只同步这 500 条。

常见 SQL 思路是:

复制代码
select *
from X_TP_ACH_DST
where UPDATE_DATE > 上次同步时间;

你图里左侧出现了:

复制代码
UPDATE_DATE

这个就很像增量字段

它的作用是告诉系统:

根据 UPDATE_DATE 判断哪些数据是后来新增或修改的。


3. 用一个例子理解

源表:

ID NAME UPDATE_DATE
1 A 2025-09-15 10:00:00
2 B 2025-09-15 11:00:00
3 C 2025-09-16 09:00:00

假设上次同步时间是:

复制代码
2025-09-15 23:59:59

如果选全量

复制代码
同步 ID=1、2、3,全都同步

如果选增量

复制代码
只同步 ID=3

因为只有 ID=3 的 UPDATE_DATE 晚于上次同步时间。


4. 图里的"自动计算"和"自定义"是什么

你图里增量下面还有:

复制代码
自动计算
自定义

一般含义是:

自动计算

系统自己记录上次同步到哪里了。

比如系统记住:

复制代码
上次同步到 UPDATE_DATE = 2025-09-15 23:59:59

下次自动拼条件:

复制代码
where UPDATE_DATE > '2025-09-15 23:59:59'

自定义

你自己指定增量条件。

比如:

复制代码
where UPDATE_DATE >= '2025-09-16 00:00:00'

或者指定某个时间范围。


后面的三个策略和多表模式一样

作业配置完成之后,点击监控按钮

点击立即执行。注意列表不是实时刷新,点击查询刷新

运行成功后,操作-查看详情

来到这里给作业执行,作业才会开始周期性调度

数据开发

点击 +

到此界面,按照地面工程建设.xlsx 填写项目名称和源数据集,目标数据集。

项目名称就是表里的作业这一列,源数据集选择后设为源,目标数据集同理。

保存-直接按默认的点击确定-数据准备阶段结束

来到图形化数据组织界面

双击数据集输入-下方出现源数据集信息

数据集详情

SQL编辑界面写上文档给的sql代码,按要求改,点击sql校验

双击数据集输出-更新字段-获取更新字段-字段映射-确定-猜一猜-确定-保存

单作业运维-选中正在做的作业的序号-立即执行-确定

点进该作业-历史运行情况

同名映射已经默认进行了猜一猜,不满意的就点删除,删除的就会去左边两个地方。