Spark Scala 如何从结构化JSON提取embedding生成数组类型RDD
Spark Scala 提取JSON中embedding字段为独立数组RDD的实现
核心前置说明
给定的JSON结构是整个文件为单个大数组,并非Spark默认支持的行分隔JSON格式(即每行一个独立JSON对象),读取时需要做特殊配置,否则会出现解析为空的问题。
实现方案
分布式兼容方案(优先推荐,无单节点OOM风险)
- 第一步:配置支持多行解析的JSON读取逻辑
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("ExtractEmbeddingRDD") .getOrCreate() // 关键配置:开启multiLine模式,适配跨多行的单个数组结构JSON val sourceDF = spark.read .option("multiLine", "true") .json("你的JSON文件实际存储路径")
- 第二步:提取embedding列并转换为目标RDD结构
// 每一行直接取出对应的embedding数组,形成RDD val embeddingRDD = sourceDF .select("embedding") .rdd .map(row => row.getSeq[Double](0).toArray)
最终得到的embeddingRDD中,每一个元素都是对应JSON对象里独立的embedding浮点数组,完全匹配需求。
轻量直读方案(仅适合小体积JSON文件)
如果不需要分布式计算能力、文件体积较小,可以直接解析全量文本提取内容:
import scala.util.parsing.json.JSON // 读全量文件文本 val fullFileText = spark.sparkContext.textFile("你的JSON文件实际存储路径").collect().mkString // 解析整个JSON数组 val jsonItems = JSON.parseFull(fullFileText) match { case Some(items: List[Map[String, Any]]) => items case _ => throw new IllegalArgumentException("JSON结构不符合预期") } // 并行化生成目标RDD val embeddingRDD = spark.sparkContext.parallelize( jsonItems.map(item => item("embedding").asInstanceOf[Seq[Double]].toArray) )
注意:轻量方案会把全量JSON文本拉取到Driver节点解析,大文件场景极易触发OOM,生产环境请优先使用带multiLine配置的分布式读取方案。
内容的提问来源于stack exchange,提问作者MetalRaptor11
相关产品推荐
相关产品推荐

