将一个RDD的每个值与另一个RDD

时间:2016-01-26 20:16:09

标签: apache-spark pyspark

这让我困扰了一段时间,我确信自己很无脑。

我有两个键/值对的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形式中。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  

是否有适当的地图或内置功能来执行此操作?

是的,有,它被称为cartesian

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

rddA.cartesian(rddB).map(transform)

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