我有一个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;本身就是分发的。有人可以建议一个更分散的方式来实现这个目标吗?
答案 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())
这个问题的解决方案应该沿着这条线。