PySpark对DataFrame两整数列做除法提示不支持元素赋值如何解决
报错原因
PySpark DataFrame 是分布式不可变数据结构,设计上就不支持 Pandas 风格的df[新列名] = 列表达式这种原位赋值语法,你代码中最后一行的写法是Pandas的常用写法,在PySpark中无法生效,因此触发了'DataFrame' object does not support item assignment报错。
正确解决方案
将最后一行的赋值逻辑替换为PySpark官方提供的withColumn方法来新增列即可,withColumn会返回新增列后的新DataFrame对象,我们将其重新赋值给df变量即可完成列新增操作。
修改后的完整可运行代码:
from pyspark.sql.types import IntegerType simpleData = ((1, 2), (2, 6), (3, 6)) columns= ["sales","users"] df = spark.createDataFrame(data = simpleData, schema = columns) df = df.withColumn("users", df["users"].cast(IntegerType())) df = df.withColumn("sales", df["sales"].cast(IntegerType())) # 替换原错误赋值行为 df = df.withColumn("buy_rate", df["sales"] / df["users"])
可选优化:处理除零异常
如果users列存在0值,直接除法会得到null结果,你可以配合when函数做兼容处理:
from pyspark.sql.functions import when from pyspark.sql.types import IntegerType simpleData = ((1, 2), (2, 6), (3, 6), (4, 0)) columns= ["sales","users"] df = spark.createDataFrame(data = simpleData, schema = columns) df = df.withColumn("users", df["users"].cast(IntegerType())) df = df.withColumn("sales", df["sales"].cast(IntegerType())) # users为0时返回0,可根据业务需求调整otherwise的返回值 df = df.withColumn("buy_rate", when(df["users"] != 0, df["sales"] / df["users"]).otherwise(0))
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

