Python 如何在PySpark中展平使用zip转换创建的元组
我有两个RDD——RDD1和RDD2,结构如下: RDD1:Python 如何在PySpark中展平使用zip转换创建的元组,python,apache-spark,ipython,pyspark,rdd,Python,Apache Spark,Ipython,Pyspark,Rdd,我有两个RDD——RDD1和RDD2,结构如下: RDD1: [(u'abc', 1.0), (u'cde', 1.0),....] [3.0, 0.0,....] [(u'abc', 1.0,3.0), (u'cde', 1.0,0.0),....] RDD2: [(u'abc', 1.0), (u'cde', 1.0),....] [3.0, 0.0,....] [(u'abc', 1.0,3.0), (u'cde', 1.0,0.0),....] 现在我想形成第三个RDD,它将
[(u'abc', 1.0), (u'cde', 1.0),....]
[3.0, 0.0,....]
[(u'abc', 1.0,3.0), (u'cde', 1.0,0.0),....]
RDD2:
[(u'abc', 1.0), (u'cde', 1.0),....]
[3.0, 0.0,....]
[(u'abc', 1.0,3.0), (u'cde', 1.0,0.0),....]
现在我想形成第三个RDD,它将上述两个RDD的每个索引的值合并在一起。因此,上述输出应为:
RDD3:
[(u'abc', 1.0), (u'cde', 1.0),....]
[3.0, 0.0,....]
[(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)形成的。
压缩后,您可以简单地重塑数据:
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))
但是Python3不再支持它
如果要提取更多的值,使用索引可能会很乏味
lambda t: (t[0][0], t[0][1], t[0][2], ..., t[1]))
因此,您可以尝试以下内容:
lambda t: tuple(list(t[0]) + [t[1]])
或者实施一个更复杂的解决方案,如下图所示:您只需在压缩后重新塑造数据:
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))
但是Python3不再支持它
如果要提取更多的值,使用索引可能会很乏味
lambda t: (t[0][0], t[0][1], t[0][2], ..., t[1]))
因此,您可以尝试以下内容:
lambda t: tuple(list(t[0]) + [t[1]])
或者实现一个更复杂的解决方案,如这里所示:使用后续映射来创建所需的元组。@Marcin我做了
RDD3=RDD1.map(lambda x:x).zip(RDD2)
就像我在上面的帖子中提到的那样,但这并不能生成所需的输出;另外,你的映射是不可操作的,因为它应用了身份转换。使用后续映射来创建你想要的元组。@Marcin我做了RDD3=RDD1.map(lambda x:x).zip(RDD2)
,就像我在上面的帖子中提到的那样,但这不会产生所需的输出;此外,你的地图是一个无操作,因为它应用了身份转换。