如何在PySpark中展平使用zip转换创建的元组

时间:2015-08-17 19:24:48

标签: python apache-spark ipython pyspark rdd

我有两个RDD - RDD1和RDD2具有以下结构:

RDD1集:

[(u'abc', 1.0), (u'cde', 1.0),....]

RDD2:

[3.0, 0.0,....]

现在我想形成第三个RDD,它将上述两个RDD的每个索引的值合在一起。所以上面的输出应该变成:

RDD3:

[(u'abc', 1.0,3.0), (u'cde', 1.0,0.0),....]

正如您所看到的,RDD2中的值被添加到RDD1的元组中。我怎样才能做到这一点?我试图做RDD3 = RDD1.map(lambda x:x).zip(RDD2)但它会产生这个输出 - [((u'abc', 1.0),3.0), ((u'cde', 1.0),0.0),....]这不是我想要的,因为你可以看到RDD1和RDD2的值之间的分隔()

注意:我的RDD1是使用 - RDD1 = data.map(lambda x:(x[0])).zip(val)

形成的

1 个答案:

答案 0 :(得分:4)

您可以在压缩后简单地重塑数据:

rdd1 = sc.parallelize([(u'abc', 1.0), (u'cde', 1.0)])
rdd2 = sc.parallelize([3.0, 0.0])

rdd1.zip(rdd2).map(lambda t: (t[0][0], t[0][1], t[1]))

在Python 2中,可以使用:

rdd1.zip(rdd2).map(lambda ((x1, x2), y): (x1, x2, y))

但Python 3不再支持它。

如果你有更多的值使用索引提取可能是乏味的

lambda t: (t[0][0], t[0][1], t[0][2], ..., t[1]))

所以你可以尝试这样的事情:

lambda t: tuple(list(t[0]) + [t[1]])

或实施更复杂的解决方案,例如:Flatten (an irregular) list of lists