точечный продукт комбинации элементов RDD с использованием pySpark

У меня есть RDD, где каждый элемент представляет собой кортеж формы

[ (index1,SparseVector({idx1:1,idx2:1,idx3:1,...})) , (index2,SparseVector() ),... ]

Я хотел бы получить скалярное произведение каждого из значений в этом RDD, используя метод SparseVector1.dot(SparseVector2), предоставляемый классом mllib.linalg.SparseVector. Я знаю, что в python есть модуль itertools.combinations, который можно использовать для вычисления комбинаций точечных произведений. Может ли кто-нибудь предоставить фрагмент кода для достижения того же? Я могу только сделать RDD.collect(), поэтому я получаю список всех элементов в RDD, а затем запускаю itertools.combinations в этом списке, но, насколько я понимаю, это будет выполнять все вычисления в корне и не будет распределяться по -се. Может ли кто-нибудь предложить более распределенный способ достижения этого?


person anonuser0428    schedule 09.05.2015    source источник


Ответы (1)


def computeDot(sparseVectorA, sparseVectorB):
    """
    Function to compute dot product of two SparseVectors
    """
    return sparseVectorA.dot(sparseVectorB)

# Use Cartesian function on the RDD to create tuples containing 
# 2-combinations of all the rows in the original RDD

combinationRDD = (originalRDD.cartesian(originalRDD))

# The records in combinationRDD will be of the form 
# [(Index, SV1), (Index, SV1)], therefore, you need to
# filter all the records where the index is not equal giving
# RDD of the form [(Index1, SV1), (Index2, SV2)] and so on,
# then use the map function to use the SparseVector's dot function

dottedRDD = (combinationRDD
             .filter(lambda x: x[0][0] != x[1][0])
             .map(lambda x: computeDot(x[0][1], x[1][1])
             .cache())

Решение этого вопроса должно быть по этой линии.

person MessyCoder    schedule 30.01.2016