You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:23:14