关于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
相关产品推荐
相关产品推荐

