使用 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(注意flatMapmaptransformations 而不是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的主要内容,如果未能解决你的问题,请参考以下文章

PySpark,按键交叉

pyspark中的交叉验证

Pyspark 线性回归梯度下降交叉验证

PySpark 中的分层交叉验证

pyspark 结构数据处理

将保存不同对象的两个不同列表组合到第三个列表中,将对象作为两个列表的交叉连接