PySpark中pandas_udf调用stats.norm.pdf触发AttributeError错误求助
解决pandas_udf中的AttributeError问题
错误的核心原因是:stats.norm.pdf接收pd.Series作为输入时,返回的是numpy.ndarray类型,而你的pandas_udf函数声明返回pd.Series,Spark在处理返回值时尝试对ndarray调用.array属性(内部逻辑),从而触发AttributeError。
你提到用np.sqrt没问题,是因为pandas对numpy的基础函数做了兼容包装——当给np.sqrt传入pd.Series时,它会返回pd.Series而非ndarray,所以能被Spark正确处理。
修正方法很简单,把stats.norm.pdf返回的ndarray转换成pd.Series即可:
from pyspark.sql import functions as F import pyspark.sql.types as T import pandas as pd import numpy as np from scipy import stats df = sqlContext.createDataFrame( [(25, 20, .25), (20, 20, .22), (35, 20, .67)], ["control_mean", "control_sd", "pooled_se"] ) def foo(control_mean: pd.Series, control_sd: pd.Series, pooled_se: pd.Series) -> pd.Series: mu_null = 0 ##Calculate Likelihood of Null pdf = stats.norm.pdf(control_mean, mu_null, pooled_se) # 将numpy.ndarray转换为pd.Series return pd.Series(pdf) foo_pudf = F.pandas_udf(foo, returnType=T.FloatType()) df.withColumn( "pdf", foo_pudf( F.col("control_mean"), F.col("control_sd"), F.col("pooled_se") ) ).show()
另外注意:你传入的control_sd参数在函数内未被使用,可考虑删除或调整逻辑避免冗余。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

