Spark提取JSON结构体中phone字段值遇from_json空值问题求助
问题原因与解决方案
问题根源
你用from_json得到空值的核心原因是Schema定义错误:你把struct里的value字段类型设为了BinaryType,但实际数据中value是字符串类型,类型不匹配导致解析失败,返回空值。
修正步骤
1. 修正Schema定义
把value的类型改为StringType,和实际数据类型匹配:
import org.apache.spark.sql.types._ val sch = ArrayType(StructType(Array( StructField("key", StringType), StructField("value", StringType) // 这里从BinaryType改成StringType )))
2. 解析并提取phone字段
先解析custHeader列,再从解析后的数组中筛选出key为phone的元素,提取其value作为单独列:
import org.apache.spark.sql.functions._ val df02 = df01 .withColumn("ext_val", from_json(col("custHeader").cast(StringType), sch)) // 筛选key为phone的元素,取第一个的value .withColumn("phone", element_at(filter(col("ext_val"), x => x("key") === lit("phone")), 1)("value")) // 可选:不需要ext_val列的话可以删掉 .drop("ext_val")
简化方案(无需完整解析)
如果custHeader本身就是字符串类型,也可以直接用get_json_object提取,不用完整解析整个数组:
val df02 = df01.withColumn("phone", get_json_object(col("custHeader"), "$[?(@.key=='phone')].value"))
内容的提问来源于stack exchange,提问作者marc
相关产品推荐
相关产品推荐

