Pyspark报name 'when' is not defined错误,用F.when也无效求助
Pyspark NameError报错解决方案
根因:你代码中用到的when、col、lit都属于pyspark.sql.functions下的内置函数,没有正确导入就直接调用会触发未定义报错。你只替换了when为F.when,其他lit、col以及链式调用的第二个when也需要同步处理。
以下是两种可行修复方案:
方案一:统一使用F别名调用所有函数
首先确认代码开头已经导入functions别名F和Window类:
import pyspark.sql.functions as F from pyspark.sql.window import Window
之后修改对应代码段,所有用到内置函数的地方都加F.前缀:
joinDf = join_df2(df_tgt_device_dim.withColumn("hashvalue", F.sha2(F.concat_ws(",", *valColumns), 256)).alias("target"), df_final.withColumn("hashvalue", F.sha2(F.concat_ws(",", *valColumns), 256)).alias("source"), conditions, "full_outer", keyColumns) deltaDf = get_active_records(joinDf, common_cols, "Type2") wind_spc = Window.partitionBy(*keyColumns).orderBy(F.col("effective_start_ts").desc()) df_device_new = deltaDf.withColumn("Rank", F.row_number().over(wind_spc)) deltaDf_final = df_device_new.filter(F.col("diff") != 'unchanged_act_records').withColumn("crnt_ind",F.when(df_device_new.Rank == 1 ,F.lit('Y'))\ .when(df_device_new.Rank != 1 ,F.lit('N'))).drop("Rank") deltaDf_final.union(deltaDf.filter(F.col("diff") == 'unchanged_act_records').withColumn("crnt_ind",F.lit('N'))).createOrReplaceTempView(f"device_delta")
方案二:直接导入需要用到的函数
在代码开头添加导入语句,不需要修改原有业务逻辑:
from pyspark.sql.functions import col, lit, when, sha2, concat_ws, row_number from pyspark.sql.window import Window
修改后原有代码不需要加F前缀即可正常运行。
可选优化点:你代码中df_device_new .Rank中间的多余空格可以去掉,避免后续不必要的语法解析问题。
内容的提问来源于stack exchange,提问作者SanjanaSanju
相关产品推荐
相关产品推荐

