Spark中两个RDD的笛卡尔积

时间:2015-06-22 23:04:33

标签: python apache-spark dot-product

我是Apache Spark的新手,我尝试使用Cartesian产品两个RDD。作为一个例子,我有A和B之类的:

A = {(a1,v1),(a2,v2),...}
B = {(b1,s1),(b2,s2),...}

我需要一个新的RDD,如:

C = {((a1,v1),(b1,s1)), ((a1,v1),(b2,s2)), ...}

知道我怎么能这样做吗?尽可能简单:)

提前致谢

PS:我终于像@Amit Kumar所建议的那样做了这个:

cartesianProduct = A.cartesian(B)

3 个答案:

答案 0 :(得分:5)

那不是点积,那是笛卡尔积。使用cartesian方法:

def cartesian[U](other: spark.api.java.JavaRDDLike[U, _]): JavaPairRDD[T, U]
  

返回此RDD的笛卡尔积和另一个,即所有元素对(a,b)的RDD,其中a位于this且b位于other

Source

答案 1 :(得分:1)

您可以执行以下操作:

A = {(a1,v1),(a2,v2),...}
B = {(b1,s1),(b2,s2),...}

C = A.cartesian(B)

如果你这样做:

C.take(5)

你可以看到这就是你想要的。

答案 2 :(得分:1)

如果您对如何处理多个列表感到好奇,请参阅pyspark中的示例

>>> a = [1,2,3]
>>> b = [5,6,7,8]
>>> c = [11,22,33,44,55]
>>> import itertools
>>> abcCartesianRDD = sc.parallelize(itertools.product(a,b,c))
>>> abcCartesianRDD.count() #Test
    60