这让我困扰了一段时间,我确信自己很无脑。
我有两个键/值对的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形式中。
感谢您的帮助!
答案 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)
问题是大型数据集上的笛卡尔积通常是一个非常糟糕的想法,并且通常有更好的方法。