使用 pyspark 交叉组合两个 RDD

cross combine two RDDs using pyspark

如何交叉组合(这是正确的描述方式?)两个 RDDS?

输入:

rdd1 = [a, b]
rdd2 = [c, d]

输出:

rdd3 = [(a, c), (a, d), (b, c), (b, d)]

我试过 rdd3 = rdd1.flatMap(lambda x: rdd2.map(lambda y: (x, y)),它抱怨 It appears that you are attempting to broadcast an RDD or reference an RDD from an action or transformation.。我想这意味着你不能像列表理解那样嵌套 action,一个语句只能做一个 action.

因此,正如您所注意到的,您无法在另一个 transformation 中执行 transformation(请注意,flatMapmaptransformations 而不是actions 因为它们 return RDD)。值得庆幸的是,Spark API 中的另一个转换直接支持您尝试完成的工作 - 即 cartesian(参见 http://spark.apache.org/docs/latest/api/python/pyspark.html#pyspark.RDD)。

所以你会想做 rdd1.cartesian(rdd2)

您可以使用笛卡尔变换。 Here's 文档中的示例:

>>> rdd = sc.parallelize([1,2])
>>> sorted(rdd.cartesian(rdd).collect())
[(1, 1), (1, 2), (2, 1), (2, 2)]

在你的情况下,你会做 rdd3 = rdd1.cartesian(rdd2)