使用 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
(请注意,flatMap
和 map
是 transformations
而不是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)
如何交叉组合(这是正确的描述方式?)两个 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
(请注意,flatMap
和 map
是 transformations
而不是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)