Scala Spark解析JSON提取同名City列首值为null问题求助
问题根因
你在定义JSON解析的StructType时重复声明了两个同名City字段,Spark的from_json函数处理JSON数据时,对于JSON中仅存在一个的同名键,只会将值赋值给schema中最后一个匹配到的同名字段,前面声明的同名字段会默认填充null,这就是第一列City返回空的直接原因。
修正方案
不要在解析schema中定义重复的City字段,先按正常逻辑解析出单个City字段,查询时主动复制一列并重命名为City即可,修正代码如下:
val jsonString="""{"Zipcode":704,"ZipCodeType":"STANDARD","City":"PARC PARQUE","State":"PR"}""" val data = Seq((1, jsonString)) import spark.implicits._ val df=data.toDF("id","value") import org.apache.spark.sql.functions.from_json import org.apache.spark.sql.types.{StringType, StructType} // 解析用schema仅声明1次City字段 val parseSchema = new StructType() .add("Zipcode", StringType, true) .add("ZipCodeType", StringType, true) .add("City", StringType, true) val parsedDf = df.withColumn("value", from_json(col("value"), parseSchema)) // 查询时主动复制一列City,两个列都保留City命名 val resultDf = parsedDf.select( col("id"), col("value.Zipcode"), col("value.ZipCodeType"), col("value.City").alias("City"), col("value.City").alias("City") ) resultDf.show()
运行上述代码即可得到你期望的结果,两个City列均返回PARC PARQUE。
内容的提问来源于stack exchange,提问作者Sofia Sehgal
相关产品推荐
相关产品推荐

