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

时间:2019-02-26 14:45:40

标签: apache-spark pyspark apache-spark-sql apache-spark-mllib

我已经在Spark中实现了分类算法,该算法涉及计算实例之间的距离。该实现使用数据框(如果可能,还使用原始SQL)。我将实例的特征转换为向量,因此无论我的数据集恰好具有多少个特征,我都可以应用Scaler并得到统一的模式。

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

我的问题是:

  • 在SQL中无法计算两个特征向量之间的距离(不使用UDF)是否正确?
  • 使用UDF来计算向量之间的距离是否会对性能产生重大影响,还是Spark不能在此处进行优化?
  • 还有其他我想念的事情吗?

要清楚,我希望答案是

  • “您做错了,这确实效率低下,请按照以下方法操作:...”或
  • “ UDF并不是本质上效率低下的,这对它们来说是一个很好的用法,而且您不会错过任何优化”

1 个答案:

答案 0 :(得分:0)

UDF效率不高,也未优化,尤其是如果您使用PySpark,则不会将其传输到jvm代码,创建了pickle对象,OS花了很多资源从jvm进/出传输。我已经在pyspark中使用udf进行了地理定位,并且在几天之内无法完成,而在scala中实现的功能却在数小时内完成。 如果需要,可以在scala中执行。 也许可以帮上忙 https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/mllib/CosineSimilarity.scala