无法将外部变量访问pyspark UDF

时间:2018-09-01 22:01:55

标签: python apache-spark pyspark databricks

我有一个具有N列的数据框。我要遍历所有列,因为我想从该列派生新列。 为了创建新列,我需要将两个额外的外部变量传递给udf进行整个计算。

这就是我现在正在做的事情。

def calculate_ratio(user_col_v, user_col_sum, overall_cnt, overall_col_sum):
        current_ratio = user_col_v * (user_col_v / user_col_sum)
        overall_ratio = overall_cnt * (overall_cnt / overall_col_sum)
        return (current_ratio + overall_ratio) / (user_col_v + overall_cnt)

还有一个

def udf_proportion(overall_val_cnt, overall_val_sum):
        return udf(lambda x, y: calculate_ratio(x, y, overall_val_cnt, overall_val_sum))

这里overall_val_cnt, overall_val_sum是外部变量,它们总是根据列的值而变化。

当我尝试跑步时

grouped_df = grouped_df.withColumn("weighted_" + new_col_name, udf_proportion(overall_val_counter,overall_all_val_sum)(grouped_df[new_col_name], grouped_df[col_sum_name]))

结果为

org.apache.spark.SparkException: Job aborted due to stage failure: Task 15 in stage 111.0 failed 4 times, most recent failure: Lost task 15.3 in stage 111.0 (TID 4865, 10.0.63.196, executor 0): net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for numpy.dtype)

udf_proportion函数中,如果我简单地返回x or y即可,但是当我尝试返回overall_val_cnt or overall_val_sum时,它将返回错误。我不明白为什么它不起作用。

注意: total_val_cnt,overall_val_sum是简单的整数,我正在databrik上运行所有这些操作。

非常感谢!

0 个答案:

没有答案