我有一个具有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上运行所有这些操作。
非常感谢!