将一个 RDD 的每个值与另一个 RDD 的每个 key/value 对进行比较

Compare each value of one RDD to each key/value pair of another RDD

这已经困扰我一段时间了,我确定我很没脑子。

我有两个 key/value 对的 RDD,对应于一个名称和关联的稀疏向量:

RDDA = [ (nameA1, sparsevectorA1), (nameA2, sparsevectorA2), (nameA3, sparsevectorA3) ]

RDDB = [ (nameB1, sparsevectorB1), (nameB2, sparsevectorB2) ]

我希望最终结果是将第一个 RDD 的每个元素与第二个 RDD 的每个元素进行比较,生成一个包含 3 * 2 = 6 个元素的 RDD。特别是,我想要第二个 RDD 中的元素名称和两个稀疏向量的点积:

RDDC = [ (nameB1, sparsevectorA1.dot(sparsevectorB1)), (nameB2, sparsevectorA1.dot(sparsevectorB2)), 
(nameB1, sparsevectorA2.dot(sparsevectorB1)), (nameB2, sparsevectorA2.dot(sparsevectorB2)), 
(nameB1, sparsevectorA3.dot(sparsevectorB1)), (nameB2, sparsevectorA3.dot(sparsevectorB2)) ]

是否有合适的地图或内置函数来执行此操作?

我想这样的操作一定存在,所以我有一种无脑的感觉。如果我收集这两个 RDD,然后实现一个 for 循环,我可以轻松而不优雅地执行此操作,但当然这并不令人满意,因为我想将它们保留为 RDD 形式。

感谢您的帮助!

Is there an appropriate map or inbuilt function to do this?

是的,有,叫做cartesian

def transform(ab):
    (_, vec_a), (name_b, vec_b) = ab
    return name_b, vec_a.dot(vec_b)

rddA.cartesian(rddB).map(transform)

问题是大型数据集上的笛卡尔积通常是一个非常糟糕的主意,通常有更好的方法。