Неэффективно ли использовать UDF для вычисления расстояния между двумя векторами? - PullRequest
0 голосов
/ 26 февраля 2019

Я реализовал алгоритм классификации в Spark, который включает в себя расчет расстояний между экземплярами.Реализация использует кадры данных (и необработанный SQL, где это возможно).Я преобразую свойства экземпляров в вектор, чтобы я мог применить Scaler и получить единую схему независимо от того, сколько функций у моего набора данных.

Насколько я понимаю, Spark SQL можетне делайте вычисления с векторными столбцами.Поэтому, чтобы вычислить расстояние между экземплярами, мне нужно было определить функцию python и зарегистрировать ее как UDF.Но я вижу предупреждения против использования UDF, потому что механизм обработки данных «не может оптимизировать UDF».

Мои вопросы:

  • Правильно ли, что нет способа вычислить расстояниемежду двумя векторами объектов в SQL (без использования UDF)?
  • Может ли использование UDF для вычисления расстояния между векторами сильно повлиять на производительность, или Spark вообще ничего не оптимизирует?
  • Есть еще какие-то соображения, которые я пропустил?

Чтобы быть ясным, я надеюсь, что ответ будет либо

  • "Вы делаетеэто неправильно, это действительно неэффективно, вот как это сделать вместо этого: ... ", или
  • " UDF не являются по сути неэффективными, это совершенно хорошее применение для них, и вы не пропускаете ни одной оптимизациина "

1 Ответ

0 голосов
/ 26 февраля 2019

UDF неэффективны и не оптимизированы и не переносятся в код jvm, особенно если вы используете PySpark, создан объект pickle, ОС потратила много ресурсов на передачу из jvm in / out.Я реализовал что-то в pyspark, используя udf для геолокации, и это никогда не закончится через несколько дней, с другой стороны, реализовано в scala, оно закончилось через несколько часов.Сделайте это в Scala, если вам нужно это сделать.Может быть, это может помочь https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/mllib/CosineSimilarity.scala

...