You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Cerner Bunsen加载FHIR R4(UKCore)及持久化至Spark SQL的问询

如何使用Cerner Bunsen加载FHIR R4 Bundle并持久化到Spark SQL/Hive?

首先明确:Cerner Bunsen完全支持FHIR R4 Bundle的加载和Spark SQL/Hive持久化,你遇到的报错和警告主要是依赖版本不匹配以及部分配置细节问题,下面一步步帮你解决:

1. 修复核心问题:依赖版本不一致

你当前的Bunsen依赖版本混乱:bunsen-r4用了0.4.5,而bunsen-core和bunsen-spark用了0.5.7,这种版本差异会导致R4的FHIR结构定义无法被正确加载,直接抛出Unsupported FHIR version: R4错误。

请统一所有Bunsen依赖的版本,推荐使用0.5.7(该版本对R4的支持更完善),修正后的依赖配置如下:

<dependencies>
    <!-- 统一使用0.5.7版本的Bunsen依赖 -->
    <dependency>
        <groupId>com.cerner.bunsen</groupId>
        <artifactId>bunsen-r4</artifactId>
        <version>0.5.7</version>
    </dependency>
    <dependency>
        <groupId>com.cerner.bunsen</groupId>
        <artifactId>bunsen-core</artifactId>
        <version>0.5.7</version>
    </dependency>
    <dependency>
        <groupId>com.cerner.bunsen</groupId>
        <artifactId>bunsen-spark</artifactId>
        <version>0.5.7</version>
    </dependency>
    <!-- Hadoop依赖保持不变 -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>2.7.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.7.2</version>
    </dependency>
    <!-- Spark依赖保持不变 -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.11</artifactId>
        <version>2.4.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.4.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-hive_2.11</artifactId>
        <version>2.4.5</version>
    </dependency>
</dependencies>

2. 修正Bundle加载与持久化代码

你的代码逻辑没问题,但有几个小细节可以优化,同时确保Hive支持启用:

import com.cerner.bunsen.spark.Bundles;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.api.java.JavaRDD;

public class R4Test {
    public static void main(String[] args) {
        // 初始化SparkSession并启用Hive支持
        SparkSession spark = SparkSession.builder()
                .appName("FHIR R4 Bundle to Hive")
                .enableHiveSupport() // 关键:启用Hive集成,让数据持久化到Hive metastore
                .getOrCreate();

        // 初始化R4版本的Bundles处理器
        Bundles bundles = Bundles.forR4();

        // 加载单个Bundle文件(如果是多个文件,直接指定目录路径即可)
        String bundleFilePath = "/path/to/ukcore/UKCore-AllergyIntolerance-Amoxicillin-Example.json";
        JavaRDD<String> bundlesRdd = bundles.loadFromDirectory(spark, bundleFilePath, 200);

        // 持久化到Hive数据库:r4database会自动创建,表AllergyIntolerance的结构基于FHIR R4定义
        bundles.saveAsDatabase(spark, bundlesRdd, "r4database", "AllergyIntolerance");

        // 验证数据:读取Hive表查看结果
        spark.sql("SELECT id, patient.reference, code.coding[0].display FROM r4database.AllergyIntolerance").show();

        spark.stop();
    }
}

注意:生产环境中不要使用collect()方法,它会将所有数据拉取到Driver端,容易导致内存溢出,直接通过RDD处理即可。

3. 解决解析警告问题

你看到的LenientErrorHandler警告,是因为旧版本的Bunsen对R4的元素识别不完整。当你统一依赖版本到0.5.7后,这些警告应该会自动消失——新版本的Bunsen已经完整实现了FHIR R4的结构定义。

如果仍有警告(比如UK Core的自定义扩展),可以加载UK Core的StructureDefinition文件,让Bunsen识别这些扩展字段:

// 加载UK Core的StructureDefinition目录(包含所有扩展定义文件)
bundles = bundles.withStructureDefinitions(spark, "/path/to/ukcore/structure-definitions/");

4. 额外注意事项

  • 确保你的Spark集群已经正确配置Hive metastore,enableHiveSupport()会自动使用集群的Hive配置,无需额外设置。
  • 对于大规模的Bundle数据,建议使用分布式文件系统(比如HDFS)存储Bundle文件,避免本地文件路径的问题。
  • Bunsen会自动将FHIR资源的嵌套结构映射为Spark SQL的复杂类型(比如结构体、数组),你可以直接用Spark SQL查询这些字段。

内容的提问来源于stack exchange,提问作者user481a

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:32:54