Эффективный способ расчета скалярного произведения в массивной базе данных Pyspark - PullRequest
0 голосов
/ 07 августа 2020

Этот код будет запущен на фреймворке Spark с миллиардами строк, поэтому эффективный код очень важен. Это задача рекомендации, которая требует, чтобы я вычислял скалярное произведение между векторами, представляющими пользователей и элементы. Каждый вектор состоит из 15 элементов. В фреймворке данных примерно 15 миллионов уникальных пользователей и более 10 000 продуктов, которые можно им порекомендовать. Перед этим шагом подмножество продуктов, которые можно рекомендовать каждому пользователю, было сужено до 150.

Существует также проблема с отсутствующими векторами, с которой я пытался эффективно справиться. Ниже приведена моя попытка решения с использованием плотных векторов.

from pyspark.sql import functions as f_
from pyspark.ml.linalg import DenseVector

spark_df = spark_df.withColumn('dot_prod',
    f_.udf(lambda x,y: float(x.dot(y)) if ((x is not None) & (y is not None, DoubleType()
    (f.col('vec_a_dense'), f.col('vec_b_dense)))

Я не уверен, но я считаю, что узкое место моих вычислений может быть здесь. Если у кого-нибудь есть предложения относительно того, существует ли более эффективный способ вычисления скалярного произведения без возникновения ошибок, если векторы отсутствуют, я был бы очень признателен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...