3. 临床数据源系统解析
临床数据ETL工程的第一道难关不是写SQL,而是搞清楚数据究竟从哪里来、以什么形态存在、通过什么接口暴露出来。同样是"患者的一次血糖测量",在EHR里可能是护理记录单上的一条结构化观察项,在LIS里是检验仪器输出的定量结果,在可穿戴设备里则是连续时间序列中的一个采样点。如果工程师不区分这些来源的接口机制与数据特征,抽取阶段就会把不同语义的数据混为一谈,后续清洗和质控将无从下手。
六类数据源的接口机制与数据特征
电子健康记录(EHR)是临床数据的核心枢纽,通常以关系型数据库(如Oracle、SQL Server)为底层存储,通过HL7 v2消息、FHIR API或直接数据库视图对外提供数据。EHR的数据特征是"宽而杂":一张患者表可能包含上百个字段,大量字段以自由文本或编码字典形式存在,同一概念在不同科室可能使用不同的本地编码。例如"收缩压"在某个EHR中可能同时存在LOINC编码8480-6、本地编码SBP001和自由文本"收缩压(mmHg)"三种表达。抽取EHR时,必须优先确认编码字典的映射关系,而非直接按字段名取值。
电子数据采集系统(EDC)主要用于临床试验,数据以CRF表单为单位组织,结构高度规范化。EDC通常提供REST API或ODM(Operational Data Model)XML导出,字段带有明确的变量名、数据类型和访视点标识。其数据特征是"窄而规整":每个字段都有预定义的数据类型和取值范围,缺失值有明确的编码规则(如空值、未做、不适用)。EDC接口的挑战不在于结构解析,而在于访视点对齐和重复表单的去重逻辑。
实验室信息系统(LIS)连接生化、免疫、血常规等检验仪器,数据以检验项目为粒度,包含标本号、检验项目代码、结果值、单位、参考范围、异常标志等字段。LIS通常通过HL7 v2的ORU^R01消息推送结果,或提供数据库表直接查询。其数据特征是"定量为主、单位敏感":同一检验项目在不同仪器上可能使用不同单位(如血糖mg/dL与mmol/L),且结果值可能带有"<"、">"等限定符。抽取时必须保留原始单位与限定符,不能提前做单位换算。
影像归档与通信系统(PACS)存储DICOM影像及其元数据,通过DICOM协议或DICOMweb(WADO-RS、QIDO-RS)接口访问。PACS的数据特征是"元数据与像素分离":ETL通常只抽取DICOM元数据(如StudyInstanceUID、SeriesNumber、Modality、检查日期),用于建立影像索引和关联临床数据,而非搬运像素数据。接口的关键在于Study/Series/SOP三级UID的层级关系,以及患者ID与EHR的交叉引用。
可穿戴设备通过蓝牙或厂商云平台API提供数据,典型形式是时间序列:心率、步数、睡眠分期、血氧等,采样频率从每秒到每天不等。其数据特征是"高频、带时间戳、质量参差":设备脱落、充电、信号丢失都会造成数据缺口,且不同厂商的API返回格式差异极大。抽取时需要处理时间戳时区、采样间隔不固定、以及原始信号与聚合值(如日均值)的区分。
登记数据库(如肿瘤登记、罕见病登记、器械登记)通常由登记协调员手工录入或批量导入,以研究队列为单位组织。其数据特征是"纵向随访、事件驱动":同一患者有基线记录和多次随访记录,字段以研究变量为主,可能包含EHR中没有的结局事件和量表评分。接口多为文件导出(CSV、Excel)或专用Web服务,抽取时需关注随访时间窗和失访标记。
接口抽取的实操要点
面对上述六类数据源,ETL工程师需要为每一类确定抽取策略。以EHR为例,若通过数据库视图抽取,应先查询编码字典表,建立"本地编码→标准编码"的映射表,再按映射表拉取观察项数据。以下是一个简化的映射查询示例:
-- 从EHR编码字典中提取血压相关映射
SELECT local_code, local_name, loinc_code, unit
FROM ehr_code_dict
WHERE local_name LIKE '%血压%'
OR loinc_code IN ('8480-6','8460-8');
-- 输出示例:
-- SBP001 | 收缩压 | 8480-6 | mmHg
-- DBP001 | 舒张压 | 8460-8 | mmHg
对于LIS的HL7 ORU^R01消息,抽取时需要解析OBX段中的检验项目代码、结果值、单位和异常标志。关键字段包括:OBX-3(检验项目标识)、OBX-5(结果值)、OBX-6(单位)、OBX-8(异常标志)。若结果值为"<0.5",必须原样保留,不能转换为0.5,因为"低于检测限"与"实测0.5"在临床语义上完全不同。
可穿戴设备的数据抽取则要处理时间序列的对齐问题。假设某设备以5秒间隔采集心率,一天产生17280条记录,而EHR中的生命体征记录是每4小时一次。ETL不能简单地将两者合并,而应分别保留原始粒度和聚合粒度,在分析层按需降采样。时区问题同样关键:设备可能以UTC存储时间戳,而EHR使用本地时间,抽取时必须统一转换为带时区偏移的ISO 8601格式。
常见陷阱:PACS的DICOM元数据中,PatientID可能与EHR的患者ID不一致(如PACS使用影像号,EHR使用病案号)。抽取时必须通过交叉引用表建立映射,否则影像检查与临床诊断无法关联。登记数据库的随访记录中,同一患者多次随访可能使用不同的登记编号,需按患者主索引去重。
数据特征对比与抽取优先级
| 数据源 | 主要接口 | 数据粒度 | 抽取优先级 | 关键风险 |
|---|---|---|---|---|
| EHR | HL7 v2 / FHIR / DB | 就诊/观察项 | 高 | 编码不统一、自由文本 |
| EDC | REST API / ODM | CRF表单/访视 | 高 | 访视点错位、重复表单 |
| LIS | HL7 ORU / DB | 检验项目 | 高 | 单位不一致、限定符丢失 |
| PACS | DICOM / DICOMweb | Study/Series | 中 | 患者ID映射断裂 |
| 可穿戴 | 云API / BLE | 时间序列采样点 | 中 | 时区、数据缺口、聚合混淆 |
| 登记数据库 | CSV / Web服务 | 患者随访记录 | 中 | 失访标记缺失、编号不统一 |
抽取优先级的判断依据是"该数据源是否直接支撑主要研究终点或关键质控指标"。EHR、EDC、LIS通常优先级最高,因为它们是诊断、用药、检验结果的主要来源;PACS、可穿戴设备和登记数据库则根据具体研究方案决定。无论优先级如何,抽取阶段都应遵循同一原则:保留原始语义,不在抽取时做不可逆的转换。编码映射、单位换算、时间对齐等操作应在清洗层完成,并保留转换日志,以便追溯和审计。
实操建议:为每个数据源建立一份"接口档案",记录接口类型、认证方式、字段清单、更新频率、已知数据质量问题。这份档案是后续ETL任务配置和故障排查的基础,也能帮助团队在数据源变更时快速评估影响范围。