使用 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 计算两个向量之间的距离是不是效率低下?的主要内容,如果未能解决你的问题,请参考以下文章