spark reducebykey并忽略休息

时间:2017-10-14 21:07:38

标签: 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))
...
来自一个RDD的

ki可能会或可能找不到另一个RDD的匹配。但是,如果它确实找到匹配,它将只与另一个RDD的一行匹配。换句话说,ki是两个RDD的主键。

我是通过

来做的
RDD3=RDD1.union(RDD2).reduceByKey(lambda x,y:(x+y)).filter(lambda x:len(x[1])==6)

结果RDD看起来像:

RDD3:
(k1,(s11,s12,s13,t11,t12,t13))
(k2,(s21,s22,s23,t21,t22,t23))
...

我想在计算RDD3时避免使用filter函数。它看起来像一个可以避免的计算。是否可以使用内置的火花功能来做到这一点?我不想使用spark-sql或dataframes

1 个答案:

答案 0 :(得分:1)

您需要使用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'))]