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

PySpark中from_json用StructType返回null的原因及正确用法

问题原因

你用StructType解析返回null的核心原因是Schema定义和JSON实际结构不匹配:

  • 你的JSON字符串是{"a": "1"},其中键a对应的值是字符串类型("1")
  • 但你定义的Schema里,StructField("a", MapType(StringType(), StringType()))要求a的值是一个Map类型,两者类型不兼容,PySpark解析失败就会返回null。

而用MapType能正常工作,是因为MapType(StringType(), StringType())可以匹配任意键值对都是字符串的JSON对象,不管键对应的值是字符串还是其他可转换的简单类型。

正确使用StructType的方法

根据你的JSON结构,应该把a的类型定义为StringType,而不是MapType:

from pyspark.sql import SparkSession
from pyspark.sql.types import StringType, MapType, StructType, StructField
from pyspark.sql.functions import from_json

spark = SparkSession.builder.appName("example").getOrCreate()

data = [(1, '''{"a": "1"}''')]
df = spark.createDataFrame(data, ["key", "value"])

# 正确的StructType定义:a的类型是StringType
schema = StructType([StructField("a", StringType())])
df2 = df.withColumn('data', from_json(df.value, schema))
df2.show()

执行后输出:

+---+----------+----+
|key|     value|data|
+---+----------+----+
|  1|{"a": "1"}|{1} |
+---+----------+----+

如果你的JSON实际是嵌套Map结构(比如{"a": {"b": "1"}}),那才需要把a的类型定义为MapType,此时解析才会正常工作:

# 嵌套Map的JSON示例
data = [(1, '''{"a": {"b": "1"}}''')]
df = spark.createDataFrame(data, ["key", "value"])

schema = StructType([StructField("a", MapType(StringType(), StringType()))])
df2 = df.withColumn('data', from_json(df.value, schema))
df2.show()

输出:

+---+----------------+-------------+
|key|           value|         data|
+---+----------------+-------------+
|  1|{"a": {"b": "1"}}|{a -> {b -> 1}}|
+---+----------------+-------------+
总结
  • 使用from_json时,Schema的结构和类型必须严格匹配JSON的实际结构,否则会返回null
  • MapType适合解析键值对结构不固定的JSON对象,StructType适合解析结构固定、字段明确的JSON对象

内容的提问来源于stack exchange,提问作者Rakesh Kushwaha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:02:37