Spark Scala未知JSON Schema时如何将Array<String>转为Array<Struct>
解决方案:将JSON字符串数组转换为Array(未知Schema场景)
问题分析
你的transDf中logs列是字符串数组,每个元素是独立的JSON字符串,要将其转换为Array<Struct>类型,核心是先推断单个JSON字符串的Schema,再对数组中的每个元素单独解析。你之前的代码错误在于直接用数组列去推断Schema,导致解析逻辑不匹配。
实现步骤
1. 自动推断单个JSON字符串的Schema
首先需要把数组中的所有JSON字符串提取出来,生成一个纯JSON字符串的数据集,再让Spark自动推断单个JSON的结构:
import org.apache.spark.sql.functions.explode // 展开logs数组,提取所有独立的JSON字符串 val jsonStringsDf = transDf.select(explode(col("logs")).alias("json_str")) // 推断单个JSON字符串对应的Struct Schema val singleJsonSchema = spark.read.json(jsonStringsDf.select("json_str").as[String]).schema
2. 转换数组中的每个元素为Struct
使用Spark的高阶函数transform,遍历logs数组的每个JSON字符串,用from_json结合推断出的Schema解析为Struct,最终得到Array<Struct>类型的列:
import org.apache.spark.sql.functions.{col, from_json, transform} val resultDf = transDf.withColumn( "logs", transform(col("logs"), jsonStr => from_json(jsonStr, singleJsonSchema)) )
验证结果
可以通过resultDf.printSchema()查看转换后的结构,此时logs列的类型会变为:
root |-- logs: array (nullable = true) | |-- element: struct (containsNull = true) | | |-- ... (自动推断出的JSON字段)
内容的提问来源于stack exchange,提问作者Mohit Kumar
相关产品推荐
相关产品推荐

