我在(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)如果我想指定mean
和cov
,例如:df.withColumn("MLE", mle(df['reading'], 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)