创建一个空模式,其中包含结构体

问题描述 投票:0回答:1

大家好,我今天有一个小问题,我想在创建空数据框时设置一些内容

如果我收到的 json 字段“数据”为空,我想设置一个空模式

我有下一个代码:

empty_schema = StructType([
     StructField('responseStatus', StringType(), True),
     StructField("data", ArrayType(StringType()), True),
     StructField('responseDetails', StructType([
         StructField('pagesize', IntegerType(), True),
         StructField('pageoffset', IntegerType(), True),
         StructField('size', IntegerType(), True),
         StructField('total', IntegerType(), True)
         ]))
     ])

df = spark.createDataFrame(spark.sparkContext.emptyRDD(), empty_schema)

df = df.fillna({
            "responseStatus": "SUCCESS",
            "data" : [],
            "responseDetails": {
                "pagesize": 0,
                "pageoffset": 0,
                "size": 0,
                "total": 0
            }
})


df.show()

但是我遇到了这个错误:

IllegalArgumentException: Unsupported value type java.util.ArrayList ([]).

这个想法就是有类似的东西:

{
    "responseStatus": "SUCCESS",
    "data": [],
    "responseDetails": {
        "pagesize": 0,
        "pageoffset": 0,
        "size": 0,
        "total": 0
    }
}

有人可以帮助我吗?

问候

json dataframe apache-spark pyspark
1个回答
0
投票

不能对 ArrayType 和 StructType 列使用 fill: “替换值必须是 int、float、boolean 或 string。”

尝试使用 withColumn 与何时/否则:

df = df.fillna(
    {
        "responseStatus": "SUCCESS",
    }
)
df = df.withColumn("data", F.when(df.data.isNull(), F.array()).otherwise(df.data))
df = df.withColumn(
    "responseDetails",
    F.when(
        df.responseDetails.isNull(),
        F.struct(
            F.lit(0).alias("pagesize"),
            F.lit(0).alias("pageoffset"),
            F.lit(0).alias("size"),
            F.lit(0).alias("total"),
        ),
    ).otherwise(df.responseDetails),
)
df.show()
© www.soinside.com 2019 - 2024. All rights reserved.