Этот код будет запущен на фреймворке 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)))
Я не уверен, но я считаю, что узкое место моих вычислений может быть здесь. Если у кого-нибудь есть предложения относительно того, существует ли более эффективный способ вычисления скалярного произведения без возникновения ошибок, если векторы отсутствуют, я был бы очень признателен.