2. 医疗数据源与数据接入工程

医疗数据湖仓的第一道工程关口不是建模,而是把散落在不同业务系统里的数据稳定、可追溯地接进来。医院信息系统的异构程度远超一般行业:HIS 以事务型关系库为主,EMR 大量使用半结构化文档,LIS 产生高频小批量结果,PACS 以 DICOM 影像对象存储为核心,医保结算多为批量对账文件,可穿戴设备则持续推送时序流。若接入层不区分这些差异,后续入湖数据会出现主键冲突、时间语义混乱、影像与报告脱节等问题。

六类数据源的特征与接入策略

HIS 通常承载挂号、收费、医嘱、住院等核心交易,数据以 MySQL、SQL Server 或 Oracle 为主,表结构规范、更新频繁,适合采用基于时间戳或增量日志的批量抽取,抽取频率可设为 5~15 分钟。EMR 的病程记录、入院记录、手术记录多为富文本或 XML,接入时需保留原始文档并抽取结构化字段,建议以文档 ID 与患者主索引关联。LIS 的检验结果表增长快、单条记录小,适合准实时接入,例如通过 CDC 捕获结果表变更,延迟控制在秒级。PACS 的影像文件体积大,不应直接塞入湖仓明细表,而应把 DICOM 元数据入湖、影像对象存入对象存储,通过 StudyInstanceUID 建立索引。医保结算数据一般按批次下发,字段固定、对账要求高,适合文件级批量接入并做金额与条数校验。可穿戴设备数据是典型时序流,采样频率高、设备型号杂,需要先做单位归一和时间对齐。

医疗数据源接入层:源系统 → 接入通道 → 入湖缓冲 源系统 HIS 挂号/收费/医嘱 · 关系库 EMR 病程/入院记录 · 文档 LIS 检验结果 · 高频小记录 PACS DICOM 影像 · 大对象 医保结算 对账文件 · 批次下发 可穿戴设备 心率/步数 · 时序流 接入通道 批量抽取 时间戳增量 · 5~15 min 文档解析 原文留存 + 字段抽取 CDC 准实时 变更捕获 · 秒级延迟 元数据 + 对象存储 StudyUID 索引 · 影像外置 文件批量接入 条数/金额校验 · 对账 消息流接入 单位归一 · 时间对齐 入湖缓冲与治理 原始层 ODS 贴源留存 · 可回溯 标准化与主索引 患者主索引 · 术语映射 质量校验 空值/重复/时间越界 明细层 DWD 按主题拆分 · 统一时间 监控与告警 延迟/断点/对账差异 失败重试与死信队列

批量接入与实时接入的边界

批量接入适合对时效要求不高、但需要完整快照或对账的场景。以 HIS 收费明细为例,可每天凌晨 2:00 抽取前一日全量增量,抽取条件为 update_time >= 昨日00:00 AND update_time < 今日00:00,写入 ODS 时保留源表主键、抽取批次号和抽取时间。实时接入适合 LIS 危急值、可穿戴异常心率等需要秒级响应的场景。以 LIS 结果表 CDC 为例,变更事件进入消息队列后,接入程序按 patient_id + test_item + result_time 去重,再写入 DWD 明细表。两类通道并非互斥:同一数据源可以批量做历史回填、实时做增量追平,但必须约定统一的主键和更新时间语义,否则会出现重复或漏数。

接入层设计要点

接入层应至少包含原始层、标准化层、质量校验层和监控层。原始层贴源留存,不做字段裁剪,便于问题回溯;标准化层完成患者主索引匹配、性别/检验单位/时间格式统一;质量校验层检查空值率、主键重复率、时间越界和金额勾稽;监控层记录每批次条数、延迟、失败重试次数。一个可参考的批次校验记录如下:

批次号: HIS_20250612_0200
源表: his_charge_detail
抽取条数: 18432
入湖条数: 18432
主键重复: 0
空值率(patient_id): 0.00%
时间越界: 0
状态: 成功

若入湖条数与抽取条数不一致,或主键重复率超过 0.1%,应暂停后续任务并触发告警。PACS 接入还需额外校验 StudyInstanceUID 是否与 EMR 报告关联,避免出现“有影像无报告”的孤立检查。可穿戴设备接入则要重点处理设备时钟漂移,建议以服务端接收时间作为事件时间,并保留设备上报时间作为参考字段。

接入层设计的第一原则是“先留存、再治理”。原始数据一旦丢失,后续任何标准化和建模都无法补救。因此 ODS 层应尽量保留源系统字段原貌,标准化结果写入 DWD 层,两者通过批次号和源主键关联。

常见问题与判断依据

实际接入中最常见的问题有三类:一是增量字段选择错误,例如用 create_time 代替 update_time,导致修改过的记录无法被再次抽取;二是时间语义不统一,HIS 用本地时间、可穿戴设备用 UTC,入湖后必须统一转换为带时区的时间戳;三是医保对账文件与 HIS 收费数据条数不一致,需要按结算批次逐笔核对。判断接入是否成功的依据不是“任务跑完”,而是条数一致、主键唯一、关键字段空值率可控、下游可正常关联。只有这些条件同时满足,接入层才算真正交付。