将一个 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)
问题是大型数据集上的笛卡尔积通常是一个非常糟糕的主意,通常有更好的方法。
这已经困扰我一段时间了,我确定我很没脑子。
我有两个 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)
问题是大型数据集上的笛卡尔积通常是一个非常糟糕的主意,通常有更好的方法。