python - pyspark 中数学函数和 numpy 函数的区别

标签 python numpy apache-spark pyspark

当使用 numpy 函数而不是数学函数时,为什么 pyspark 的行为不同? 例如

X = sc.parallelize([[DenseVector([4.9, 3.0, 1.4, 0.2]), DenseVector([4.6, 3.1, 1.5, 0.2])],[DenseVector([5.1, 3.5, 1.4, 0.3]), DenseVector([5.7, 3.8, 1.7, 0.3])]])
X_df = sqlcontext.createDataFrame(X, ["x","y"])
udf_foo = udf(lambda x, y:  m.exp(-x.squared_distance(y)/2.0), DoubleType())
X_sim = X_df.withColumn("sim", udf_foo(X_df.x, X_df.y))

X_sim.show()

输出

+-----------------+-----------------+------------------+
|                x|                y|               sim|
+-----------------+-----------------+------------------+
|[4.9,3.0,1.4,0.2]|[4.6,3.1,1.5,0.2]|0.9464851479534836|
|[5.1,3.5,1.4,0.3]|[5.7,3.8,1.7,0.3]|0.7633794943368529|
+-----------------+-----------------+------------------+

下面的代码

udf_foonp = udf(lambda x, y:  np.exp(-x.squared_distance(y)/2.0), DoubleType())
X_simnp = X_df.withColumn("sim", udf_foonp(X_df.x, X_df.y))

X_simnp.show()

报错

expected zero arguments for construction of ClassDict

最佳答案

因为返回类型不同:

type(np.exp(1.0))
## numpy.float64

type(math.exp(1.0))
## float

和 NumPy 类型不是 SQL 类型的有效外部表示。因此你必须投:

udf(lambda x, y: float(np.exp(-x.squared_distance(y) / 2.0)), DoubleType())

关于python - pyspark 中数学函数和 numpy 函数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45960444/

相关文章:

apache-spark - 如何合并 Spark SQL 查询的结果以避免出现大量小文件/避免空文件

apache-spark - Spark 如何将切片并行化到任务/执行器/工作器?

python - 尝试使用 django 美味馅饼发布时出现 404 错误

python - 带有列表的子集 Pandas 数据框

python - 为什么直接向 numpy 数组添加新属性不起作用,但通过子类化却可以?

python - 如何在Python中将 boolean numpy数组保存到文本文件?

python - Vim 无法保存到由 python 创建的临时文件

python - 如何在 Python 中将 N 毫秒添加到日期时间

python - 格子 su(2) 规范理论和 python 中的随机数生成

apache-spark - Spark 将字符串解析为带时区的时间戳