PySpark执行join操作后所得DataFrame无法执行操作报错排查
问题描述
创建df、rule_df、query_df三个Spark DataFrame的初始实现代码如下:
df=spark.read.csv('data.csv',header=True,inferSchema=True) rule_df=spark.read.csv('job_rules.csv',header=True) query_df=spark.read.csv('rules.csv',header=True) join_df=rule_df.join(query_df,rule_df.Rule==query_df.Rule,"inner").drop(rule_df.Rule).show() print(join_df.collect().columns)
对rule_df与query_df执行inner join操作后,将返回结果赋值给join_df变量,尝试打印join_df的列信息时触发如下报错:
AttributeError: 'NoneType' object has no attribute 'columns'
当前join返回的结果对象无法执行任何DataFrame相关操作,且执行过程中可以正常查看到join的输出内容,疑惑是否需要更换join类型才能规避报错。
根因说明
该报错和join类型没有任何关系,是两处代码写法错误导致的:
- 第一处核心错误:PySpark中DataFrame的
show()方法是用于打印数据预览的行动算子,返回值为None。代码中将.show()的返回结果直接赋值给了join_df,因此join_df实际是None类型,自然不具备DataFrame的任何属性和方法。你能看到join的输出内容,是show()方法执行时主动打印的预览结果,和join_df变量存储的内容无关。 - 第二处写法错误:即使
join_df是正常的DataFrame对象,join_df.collect()返回的是由Row对象组成的Python列表,列表本身没有columns属性,列信息是DataFrame对象的直接属性,不需要调用collect()获取。
修复方案
调整链式调用顺序,先将join逻辑返回的DataFrame赋值给变量,需要预览数据时单独调用show(),直接访问DataFrame的columns属性即可获取列信息,修改后的代码如下:
df=spark.read.csv('data.csv',header=True,inferSchema=True) rule_df=spark.read.csv('job_rules.csv',header=True) query_df=spark.read.csv('rules.csv',header=True) # 不要把.show()链式写在赋值语句末尾 join_df=rule_df.join(query_df,rule_df.Rule==query_df.Rule,"inner").drop(rule_df.Rule) # 需要预览数据时单独调用show方法 join_df.show() # 直接访问DataFrame的columns属性,无需调用collect() print(join_df.columns)
内容的提问来源于stack exchange,提问作者Aishani Singh
相关产品推荐
相关产品推荐

