PySpark读取含null Struct的JSON文件字段提取报错求助
解决PySpark读取含null的嵌套JSON字段报错问题
方法1:显式指定Schema(推荐)
Spark自动推断Schema时,若存在address为null的JSON文件,可能会错误地将address字段推断为String类型,而非预期的Struct类型,导致提取嵌套字段时报错。显式定义Schema可以强制指定字段类型,避免自动推断的问题。
代码示例:
from pyspark.sql.types import StructType, StructField, IntegerType, StringType # 定义JSON的Schema json_schema = StructType([ StructField("id", IntegerType(), nullable=True), StructField("name", StringType(), nullable=True), StructField("address", StructType([ StructField("street", StringType(), nullable=True), StructField("city", StringType(), nullable=True) ]), nullable=True) ]) # 读取JSON时指定Schema sourcejson = spark.read.schema(json_schema).json("path/to/json") # 提取字段,此时address为null时,street和city会返回null df = ( sourcejson.select( col('id'), col('name'), col('address.street').alias('street'), col('address.city').alias('city') ) )
方法2:动态转换address字段类型
如果无法提前定义Schema,可以通过coalesce结合struct将非Struct类型的address(比如null或错误类型)转换为合法的Struct,再提取嵌套字段。
代码示例:
from pyspark.sql.functions import col, coalesce, struct, lit sourcejson = spark.read.json("path/to/json") # 将address转换为Struct,若为null则返回空Struct(字段均为null) df = ( sourcejson.withColumn( "address", coalesce( col("address").cast(StructType([ StructField("street", StringType()), StructField("city", StringType()) ])), struct(lit(None).alias("street"), lit(None).alias("city")) ) ).select( col('id'), col('name'), col('address.street').alias('street'), col('address.city').alias('city') ) )
内容的提问来源于stack exchange,提问作者DenStudent
相关产品推荐
相关产品推荐

