返回

Databricks 推出 Funke:湖仓原生解析 HL7v2

RSS Databricks Blog AI 逐段翻译 发布 2026-10-09 06:00
DataHot 速览

Databricks 推出 Funke,原生支持在湖仓中解析 HL7v2 医疗消息。文章指出 HL7v2 部署广泛但结构嵌套、各系统实现有差异,过去需先转 FHIR 或用第三方引擎扁平化,带来成本、延迟和数据细节损失。Funke 是 2021 年开源 Spark 库 Smolder 的继任者,针对现代 Databricks 平台重建,结合 Unity Catalog、Declarative Automation Bundles 和 Spark Declarative Pipelines。它旨在让医疗团队直接在平台内处理临床数据,减少额外厂商依赖和数据搬移。

为什么值得关注:该发布直接关系到湖仓中的医疗数据集成与治理,适合关注数据接入、平台原生解析和降低第三方依赖的数据从业者。

本文目录 9 节
  1. 湖仓一体中的 HL7v2 问题
  2. 从 Smolder 到 Funke
  3. Funke 的不同之处
  4. 工作原理:摄取管道
  5. 从原始消息到金表
  6. 端到端运行演示
  7. 快速上手
  8. Funke 是什么,以及它不是什么
  9. 试用

译文

AI 逐段翻译

湖仓一体中的 HL7v2 问题

HL7v2 是默默支撑医疗行业的消息传递标准。临床系统正是通过它来相互告知患者已入院、已下达检验医嘱或结果已返回。在推出数十年后,它仍然是业界部署最广泛的集成标准,绝大多数医疗组织仍然依赖它来实现日常运营数据的流转。

它也很难处理。HL7v2 消息是一种嵌套的、以分隔符编码的结构:段由字段组成,字段由组件和重复组成,组件由子组件组成,所有这些都由消息头中声明的一小组特殊字符分隔。该规范留有灵活性,因此现实世界中的消息因发送系统而异。

当团队希望以现代格式获取这些数据时,通常会采用两种变通方法之一。他们先将所有内容转换为 FHIR,这增加了一个转换层,并可能丢失那些从未有干净 FHIR 对应物的细节。或者他们把消息交给第三方引擎,由该引擎将层级结构扁平化为宽表,这意味着要向另一个供应商付费、将数据移出平台,并失去对底层细粒度结构的直接访问。两种路径都会增加成本、增加延迟,并让你与你自己的临床数据之间产生距离。

从 Smolder 到 Funke

2021 年,我们开源了 Smolder,这是一个 Spark 库,可将 HL7v2 消息加载到 DataFrame 中,使医疗团队无需手工编写解析器即可对实时 EHR 数据流进行分析。Smolder 使得在解析消息仍是采用主要障碍的时代,能够在湖仓一体中使用 HL7 数据。

自那以后,该平台已发展很远。Unity Catalog 治理数据、卷和模型。Declarative Automation Bundles 以代码形式打包和部署项目。Spark Declarative Pipelines 以声明式方式处理流式摄取。但 Smolder 早于这一切,并且并非为能干净地融入现代 Databricks 平台而构建。

Funke 是其继任者,为当今的平台重新构建。这个名字是对其血统的一个小小致敬:Funke 在德语中意为 spark。Smolder 是一个 Scala 数据源,而 Funke 是一个 Python 和 PySpark 库外加一个可随时部署的管道。它解析为原生 Spark 类型,作为 DAB 部署,通过 Declarative Pipeline 摄取,并将所有内容存储在 Unity Catalog 中。用户可以在几分钟内从零开始搭建一个可扩展的流式 HL7 管道。

Smolder 开启的理念,即把 HL7 作为一等湖仓数据,是相同的。实现是新的。

Funke 的不同之处

Funke 将 HL7v2 消息直接解析为原生 Spark 类型,并保持整个层级结构完整。该解析设计为无损,目标是在管道中尽可能远地保留所有原始结构。

解析后的消息被建模为从段名称到该段重复的映射。每个字段本身也是一个映射,可按字段编号、然后重复、然后组件、然后子组件来寻址。用 Spark 术语来说:

由于解析后的消息是一个普通的 Spark 列,每个元素都可以通过普通的 DataFrame 或 SQL 表达式访问,并且解析器为你处理 HL7 编码规则:MSH 头中声明的字段、组件、重复和子组件分隔符,以及标准转义序列。Funke 支持所有 HL7 消息类型和版本,因此同一管道可以接受医疗系统通常接收的各种版本范围内的消息。

因此,你的原始临床数据以完整保真度落入湖仓一体,由 Unity Catalog 治理,随时可查询。你可以决定哪些字段对给定用例重要,而不是接受转换器或供应商为你选择的任何形状。

工作原理:摄取管道

Funke 作为遵循奖章模式的 Declarative Pipeline 部署。它定义了两个表,你在其上为自己的用例构建金表。

图 1:Databricks 湖仓一体上的 Funke 数据流

image1.png

落地到青铜。 新的 HL7 文件到达 Unity Catalog 卷。Auto Loader 拾取它们,解码内容,并将它们写入 raw_messages 表,同时附带摄取元数据,包括用于在管道中跟踪消息的 MD5 哈希、插入时间戳和消息 ID。

青铜到白银。 parsed_messages 表读取原始流并应用 Funke 的解析器,添加一个上面所示原生类型的 hl7 列。这是非结构化消息文本变为结构化、可查询数据的地方。

从原始消息到金表

由于 hl7 列是原生 Spark 数据,你可以按段、字段、重复、组件和子组件直接寻址任何元素:

同样的提取在 Spark SQL 中也可用,因此从不接触 Python 的分析师可以直接构建金表和视图:

位置索引链很精确,但在开发数月后很难推理。因此,Funke 提供了访问器辅助函数,帮助开发者干净地提取内容。get_value 接受段、其重复、字段、字段重复、组件和子组件,并将值作为列返回:

还有更高级别的辅助函数,包括 get_segment、get_field、get_component、get_subcomponent,以及一个 parse_hl7_version 辅助函数,它直接从 MSH 头中读取版本。你选择适合查询的抽象级别。

端到端运行演示

Funke 附带一个演示,因此你无需连接实时 EHR 数据流即可观看整个流程。它包括一个合成 ADT 事件生成器,模拟一组设施中的入院、转科和出院,以及一个基于 Databricks Apps 构建的控制室应用,可启动和停止事件流,并追踪一条消息从原始文本经过解析结构到金表的过程。

该演示的金层本身就是一个可运行的示例。它将解析后的 ADT 流转换为 adt_events 历史表,然后维护一个实时 current_census表,使用以就诊编号为键的变更数据捕获,以便出院事件将患者从普查中移除并释放床位。一个bed_utilization表将该实时普查与设施容量连接起来,以显示每个单元的已占用与可用床位,为仪表板提供数据。这是一个从原始 HL7 消息到医院真正会关注的运营指标的具体示例。

快速上手

Funke 是一个 Databricks 行业解决方案加速器,以 Asset Bundle 形式部署:

  1. 将仓库克隆到你的 Databricks 工作区。
  2. 在 DAB 编辑器中打开该目录并点击Deploy。部署会构建funke库,并为你预置管道、Unity Catalog 模式以及着陆卷。
  3. 将 HL7 消息上传到创建的landing卷。
  4. 点击Run,对 HL7 摄取管道执行操作。

如果你更喜欢命令行,同样的部署可以使用 Databricks CLI 运行:

Funke 是什么,以及它不是什么

Funke 是一个解析器和摄取加速器。它为你提供原生、受治理、可查询的湖仓数据形式的 HL7v2 消息,并提供一种清晰的模式,将它们转化为你的用例所需的黄金表。它不是接口引擎,也不替代正确解读这些消息所需的临床和 HL7 专业知识。从段和字段到业务概念的映射是你凭借自身领域知识做出的决定。Funke 的职责是确保当你做出该决定时,数据就在那里,完整且易于获取。

试用

Funke 是在 Databricks License 下的开源项目。探索代码、运行演示,并通过创建 issue 提供反馈或想法:

https://github.com/databricks-industry-solutions/funke-hl7v2

演示中使用的测试消息来自HL7 v2-to-FHIR 项目。

这篇内容对你有用吗?

反馈只用于改善内容筛选,不等同于收藏

分享这条资讯
分享海报
保存图片
iOS 也可以长按图片保存