PySpark中DataFrameStatFunctions对象为何不等于自身副本
PySpark DataFrame stat属性相等判断返回False的原因
注:该现象和浅拷贝、指针引用异常类机制无关,属于PySpark API的设计预期行为
核心原因来自两点底层实现逻辑:
stat是DataFrame的动态计算属性,无实例缓存机制:每次访问df.stat时,代码都会即时新创建一个DataFrameStatFunctions类型的对象返回,不会复用之前生成过的实例。DataFrameStatFunctions类未自定义相等判断逻辑:Python中如果类没有重写__eq__魔术方法,默认的==比较逻辑是校验两个对象的内存地址,也就是判断两个变量是否指向内存中的同一个实例。
测试代码运行逻辑拆解:
# 第一次访问stat属性,生成第一个DataFrameStatFunctions实例,赋值给dfstat dfstat = df.stat # 第二次访问stat属性,生成第二个全新的DataFrameStatFunctions实例,和dfstat指向的实例内存地址完全独立 dfstat == df.stat # 两个不同实例做默认相等判断,返回False是符合预期的结果
可以通过如下代码直接验证该逻辑:
# 连续两次访问stat属性,打印两个对象的内存标识 print(id(df.stat)) print(id(df.stat))
两次输出的内存地址数值完全不同,可直接证明每次属性访问都会生成独立的新对象。
补充说明:哪怕两个DataFrameStatFunctions实例绑定的是同一个DataFrame对象,只要是不同次属性访问生成的独立实例,默认相等判断都会返回False,不属于功能bug。
内容的提问来源于stack exchange,提问作者PJ T. de Barros
相关产品推荐
相关产品推荐

