(py)Spark并行化最大似然计算

时间:2017-04-07 14:37:42

标签: python scipy pyspark mle

我在(py)Spark上有两个快速的新手问题。我有一个如下数据框,我想计算“阅读”的可能性。列使用scipy的multivariate_normal.pdf()

rdd_dat = spark.sparkContext.parallelize([(0, .12, "a"),(1, .45, "b"),(2, 1.01, "c"),(3, 1.2, "a"),
                                         (4, .76, "a"),(5, .81, "c"),(6, 1.5, "b")])
df = rdd_dat.toDF(["id", "reading", "category"])
df.show()
+---+-------+--------+
| id|reading|category|
+---+-------+--------+
|  0|   0.12|       a|
|  1|   0.45|       b|
|  2|   1.01|       c|
|  3|    1.2|       a|
|  4|   0.76|       a|
|  5|   0.81|       c|
|  6|    1.5|       b|
+---+-------+--------+

这是我尝试使用UserDefinedFunction

from scipy.stats import multivariate_normal
from pyspark.sql.functions import UserDefinedFunction
from pyspark.sql.types import DoubleType

mle = UserDefinedFunction(multivariate_normal.pdf, DoubleType())
mean =1
cov=1
df_with_mle = df.withColumn("MLE", mle(df['reading']))

这样运行时不会抛出错误,但是当我想查看生成的df_with_mle时,我会收到以下错误:

df_with_mle.show()
An error occurred while calling o149.showString.

1)我知道为什么会收到此错误?

2)如果我想指定meancov,例如:df.withColumn("MLE", mle(df['reading'], 1, 1)),我该怎么办呢?

1 个答案:

答案 0 :(得分:0)

scipy的multivariate_normal.pdf()方法期待收到一个系列。来自pandas dataframe的列是一个系列,但PySpark数据帧中的一列是另一种对象(pyspark.sql.column.Column),Scipy并不知道如何处理。

此外,这不会使您的函数调用无法运行,您的函数定义将在不指定参数的情况下结束 - 除非在方法调用中出现,否则未在API中明确定义cov和mean。 Mean和Cov只是整数对象,直到你将它们设置为参数并覆盖默认值(mean = 0,cov = 1,来自scipy文档:

multivariate_normal.pdf(x=df['reading'], mean=mean,cov=cov)