Python 点燃减速器,忽略其余部分

Python 点燃减速器,忽略其余部分,python,apache-spark,join,mapreduce,pyspark,Python,Apache Spark,Join,Mapreduce,Pyspark,我试图在两个RDD之间执行连接,第一列作为键。RDD看起来像: RDD1: (k1,(s11,s12,s13)) (k2,(s21,s22,s23)) (k3,(s31,s32,s33)) ... RDD2: (k1,(t11,t12,t13)) (k2,(t21,t22,t23)) (k4,(t41,t42,t43)) ... RDD3: (k1,(s11,s12,s13,t11,t12,t13)) (k2,(s21,s22,s23,t21,t22,t23)) ... 一个RDD中的ki

我试图在两个RDD之间执行连接,第一列作为键。RDD看起来像:

RDD1:
(k1,(s11,s12,s13))
(k2,(s21,s22,s23))
(k3,(s31,s32,s33))
...

RDD2:
(k1,(t11,t12,t13))
(k2,(t21,t22,t23))
(k4,(t41,t42,t43))
...
RDD3:
(k1,(s11,s12,s13,t11,t12,t13))
(k2,(s21,s22,s23,t21,t22,t23))
...
一个RDD中的ki可能会或可能不会从另一个RDD中找到匹配项。但是,如果它确实找到了一个匹配项,它将只与另一个RDD的一行匹配。换句话说,ki是两个rdd的主键

我是靠你做这件事的

RDD3=RDD1.union(RDD2).reduceByKey(lambda x,y:(x+y)).filter(lambda x:len(x[1])==6)
生成的RDD如下所示:

RDD1:
(k1,(s11,s12,s13))
(k2,(s21,s22,s23))
(k3,(s31,s32,s33))
...

RDD2:
(k1,(t11,t12,t13))
(k2,(t21,t22,t23))
(k4,(t41,t42,t43))
...
RDD3:
(k1,(s11,s12,s13,t11,t12,t13))
(k2,(s21,s22,s23,t21,t22,t23))
...
我想避免在计算RDD3时使用过滤函数。这看起来是一个可以避免的计算。是否可以使用内置的spark功能执行此操作?我不想使用spark sql或dataframes

您需要join方法后跟mapValues方法来连接来自同一个键的值:

rdd1.join(rdd2).mapValues(lambda x: x[0] + x[1]).collect()
# [('k2', ('s21', 's22', 's23', 't21', 't22', 't23')), 
#  ('k1', ('s11', 's12', 's13', 't11', 't12', 't13'))]