大家好,我今天有一个小问题,我想在创建空数据框时设置一些内容
如果我收到的 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
}
}
有人可以帮助我吗?
问候
不能对 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()