Pyspark嵌套JSON字符串列Schema定义及常见报错解决
错误原因分析
- 第一种写法错误:你错误地将数组类型的
vals字段声明为StructType,且StructType内直接嵌套StructType而非带name属性的StructField,因此触发no attribute 'name'报错。同时你不需要为数组内的两个元素重复定义两次结构,JSON数组内的元素结构统一,仅需定义一次元素结构即可。 - 第二种写法错误:
ArrayType仅接收2~3个参数:第一个为数组元素的类型,第二个为数组本身是否可空,你重复传入了两次ArrayType作为参数,参数数量超出限制因此报错。
正确Schema定义
首先导入需要的类型:
from pyspark.sql.types import StructType, StructField, StringType, IntegerType, ArrayType, DoubleType
正确的Schema写法如下:
schema = StructType([ # Day字段在JSON中为数值类型,也可根据需要改为StringType StructField("Day", IntegerType(), True), # vals是数组,ArrayType内部指定数组元素的结构即可 StructField( "vals", ArrayType( StructType([ StructField("id", StringType(), True), # 注意JSON中val是字符串格式的数值,Pyspark会自动隐式转换为DoubleType,转换失败会返回null StructField("val", DoubleType(), True) ]), True # 整个vals数组是否可空 ), True ) ])
使用示例(解析字符串类型的body列)
如果你的body列是字符串格式的JSON,可以用from_json函数解析:
from pyspark.sql.functions import from_json df = df.withColumn("parsed_body", from_json("body", schema))
解析后可以通过parsed_body.Day、parsed_body.vals访问对应字段。
内容的提问来源于stack exchange,提问作者Afrobeta
相关产品推荐
相关产品推荐

