使用 UDF 计算两个向量之间的距离是不是效率低下?

Posted

技术标签:

【中文标题】使用 UDF 计算两个向量之间的距离是不是效率低下?【英文标题】:Is it inefficient to use a UDF to calculate the distance between two vectors?使用 UDF 计算两个向量之间的距离是否效率低下? 【发布时间】:2019-02-26 14:45:39 【问题描述】:

我在 Spark 中实现了一个分类算法,该算法涉及计算实例之间的距离。该实现使用数据帧(以及可能的原始 SQL)。我将实例的特征转换为向量,这样我就可以应用 Scaler 并最终得到一个统一的模式,而不管我的数据集恰好有多少特征。

据我了解,Spark SQL 无法使用向量列进行计算。因此,为了计算实例之间的距离,我必须定义一个 python 函数并将其注册为 UDF。但我看到了反对使用 UDF 的警告,因为数据帧引擎“无法优化 UDF”。

我的问题是:

SQL 中无法计算两个特征向量之间的距离是否正确(不使用 UDF)? 使用 UDF 计算向量之间的距离是否会对性能产生很大影响,或者 Spark 在这里没有什么可以优化的地方吗? 还有其他一些我遗漏的注意事项吗?

说清楚,我希望答案是要么

“你做错了,这确实效率低下,下面是如何做:...”,或者 “UDF 本质上并不是低效的,这对它们来说是一个非常好的用途,而且你不会错过任何优化”

【问题讨论】:

有时 UDF 是不可避免的,但如果没有具体示例,任何答案都可能是推测性的。 How to create good reproducible spark examples. 【参考方案1】:

UDF 效率不高也没有优化,也没有传输到 jvm 代码,特别是如果你使用 PySpark,会创建 pickle 对象,操作系统会花费大量资源从 jvm 输入/输出传输。我已经在 pyspark 中使用 udf 进行地理定位,但它永远不会在几天内完成,另一方面,在 scala 中实现它已经在几个小时内完成。 如果必须这样做,请在 scala 中执行。 也许这可以帮助 https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/mllib/CosineSimilarity.scala

【讨论】:

以上是关于使用 UDF 计算两个向量之间的距离是不是效率低下?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算两个 ZIP 之间的距离?

带有循环的 UDF 非常缓慢且效率低下

Matlab求两个向量之间的各种距离

如何循环遍历城市列表以计算它们之间的距离

MapReduce模型中数据关联使用or语句导致计算效率低下

计算数组中向量之间的最大距离