我在Spark中实现了一种分类算法,它涉及计算实例之间的距离。该实现使用数据框(尽可能使用原始SQL)。我将实例的功能转换为一个向量,这样我就可以应用一个Scaler并最终得到一个统一的模式,无论我的数据集碰巧有多少个特征。
据我所知,Spark SQL无法使用向量列进行计算。所以为了计算实例之间的距离,我必须定义一个python函数并将其注册为UDF。但我看到警告不要使用UDF,因为数据帧引擎“无法优化UDF”。
我的问题是:
要清楚,我希望答案是
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