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
相关产品推荐
相关产品推荐

