使用 pyspark 交叉组合两个 RDD
Posted
技术标签:
【中文标题】使用 pyspark 交叉组合两个 RDD【英文标题】:cross combine two RDDs using pyspark 【发布时间】:2015-06-25 22:54:16 【问题描述】:如何交叉组合(这是描述的正确方式吗?)这两个 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
。
【问题讨论】:
【参考方案1】:所以你已经注意到你不能在另一个transformation
中执行transformation
(注意flatMap
和map
是transformations
而不是actions
,因为它们返回RDD)。值得庆幸的是,Spark API 中的另一个转换直接支持您尝试完成的工作 - 即cartesian
(请参阅http://spark.apache.org/docs/latest/api/python/pyspark.html#pyspark.RDD)。
所以你会想要rdd1.cartesian(rdd2)
。
【讨论】:
【参考方案2】:您可以使用笛卡尔变换。 Here's 文档中的示例:
>>> rdd = sc.parallelize([1,2])
>>> sorted(rdd.cartesian(rdd).collect())
[(1, 1), (1, 2), (2, 1), (2, 2)]
在你的情况下,你会做
rdd3 = rdd1.cartesian(rdd2)
【讨论】:
以上是关于使用 pyspark 交叉组合两个 RDD的主要内容,如果未能解决你的问题,请参考以下文章