Databricks中Python函数内DataFrame外部访问报错求助
解决函数内定义的DataFrame无法在外部访问的问题
问题原因
Python里函数内部定义的变量属于局部作用域,只能在函数内部使用,函数执行完后外部就没法访问这些局部变量了——这就是你调用ADT_Finalss.display()时出现NameError: name 'ADT_Finalss' is not defined的根本原因。
解决方案
优先推荐用返回值的方式,这是Python中最规范的做法,也能避免变量冲突:
方案1:让函数返回目标DataFrame
修改你的函数,把生成的ADT_Finalss作为返回值,调用函数时把返回结果赋值给外部变量,这样就能在函数外正常访问了。示例代码:
def dist_values_validation(input_df, check_col, ref_df, ref_col): # 这里写你的原有逻辑,生成ADT_Finalss # 举个示例逻辑(你可以替换成自己的代码): valid_distinct_values = ref_df.select(ref_col).distinct() ADT_Finalss = input_df.join(valid_distinct_values, input_df[check_col] == valid_distinct_values[ref_col], "leftanti") # 返回生成的DataFrame return ADT_Finalss # 调用函数,把返回结果赋值给外部的ADT_Finalss变量 ADT_Finalss = dist_values_validation(你的输入DataFrame, '要检查的列名', 参考DataFrame, '参考列名') # 现在就能正常显示了 ADT_Finalss.display()
方案2:使用全局变量(不推荐)
如果非要在函数内部直接定义外部可访问的变量,可以用global关键字声明,但这种方式会破坏代码的封装性,容易引发变量冲突,只适合临时测试用:
def dist_values_validation(input_df, check_col, ref_df, ref_col): # 声明ADT_Finalss为全局变量 global ADT_Finalss # 你的原有逻辑生成ADT_Finalss valid_distinct_values = ref_df.select(ref_col).distinct() ADT_Finalss = input_df.join(valid_distinct_values, input_df[check_col] == valid_distinct_values[ref_col], "leftanti") # 调用函数 dist_values_validation(你的输入DataFrame, '要检查的列名', 参考DataFrame, '参考列名') # 现在可以访问ADT_Finalss了 ADT_Finalss.display()
补充说明
在Databricks中,Spark DataFrame的作用域规则和Python普通变量完全一致,只要遵循Python的作用域规范,就能解决这类问题。
内容的提问来源于stack exchange,提问作者Darkmaster
相关产品推荐
相关产品推荐

