使用pySpark的RDD元素组合的点积

时间:2015-05-09 07:04:04

标签: apache-spark pyspark rdd combinatorics

我有一个RDD,其中每个元素都是

形式的元组
[ (index1,SparseVector({idx1:1,idx2:1,idx3:1,...})) , (index2,SparseVector() ),... ]

我想通过使用mllib.linalg.SparseVector类提供的SparseVector1.dot(SparseVector2)方法获取此RDD中每个值的点积。我知道python有一个itertools.combinations模块,可以用来实现要计算的点积的组合。有人可以提供代码片段来实现相同的目标吗?我只能做一个RDD.collect(),所以我收到RDD中所有元素的列表,然后在这个列表上运行itertools.combinations,但根据我的理解,这将执行root上的所有计算并且不会# 39;本身就是分发的。有人可以建议一个更分散的方式来实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

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())

这个问题的解决方案应该沿着这条线。