Pyspark对DataFrame列四舍五入时报NoneType无select属性如何解决
问题原因
- PySpark的
show()是用于打印DataFrame内容的行动算子,返回值为None。你在给Auto_data1赋值的链式调用末尾直接加了.show(10),最终赋值给Auto_data1的不是计算得到的DataFrame,而是show()返回的空值,后续调用select方法自然会抛出NoneType无对应属性的报错。 - 额外注意:你的需求是对
perc_of_count_total列做四舍五入,但现有代码里select选中的是cnt_per_group列,和需求不符。
解决方法
调整代码把赋值和打印操作拆分即可,修改后参考代码如下:
# 先完成计算逻辑赋值给Auto_data1,不要末尾加show Auto_data1 = Auto_data.groupBy("Make", "Fuel") \ .count() \ .withColumnRenamed('count', 'cnt_per_group') \ .withColumn('perc_of_count_total', (F.col('cnt_per_group') / tot) * 100 ) # 单独执行打印预览操作 Auto_data1.show(10) # 对目标列执行四舍五入操作 Auto_data1.select(F.round(F.col('perc_of_count_total'),2)).show(5)
如果需要把四舍五入后的结果保存为DataFrame的新列,可以用withColumn实现:
Auto_data1 = Auto_data1.withColumn('perc_of_count_total_rounded', F.round(F.col('perc_of_count_total'),2)) Auto_data1.show()
内容的提问来源于stack exchange,提问作者user286076
相关产品推荐
相关产品推荐

