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

问题描述 投票:0回答:1

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

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

我的问题是:

  • 在SQL(不使用UDF)中无法计算两个特征向量之间的距离是否正确?
  • 使用UDF计算向量之间的距离是否会对性能产生很大影响,或者Spark无论如何都无法优化?
  • 还有其他一些我错过的考虑因素吗?

要清楚,我希望答案是

  • “你做错了,这确实是低效的,这里是如何做到的:......”,或者
  • “UDF本质上效率不高,这对他们来说是一个非常好的用途,并且没有你错过的优化”
apache-spark pyspark apache-spark-sql apache-spark-mllib
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.