将两个具有多值的Rdds加入Joing,并基于Pyspark中的join添加额外的值?

时间:2018-06-25 13:08:50

标签: python apache-spark pyspark apache-spark-sql pyspark-sql

我已经创建了2个RDD's,如下所示:

rdd1 = sc.parallelize([(u'176', u'244', -0.03925566875021147), (u'28', u'244', 0.9175106515709205), (u'165', u'244', -0.3837580218245722), (u'181', u'244', 0.29145693160561503), (u'161', u'244', -0.503468718448459), (u'28', u'275', 1.1636548589189926), (u'165', u'275', -1.026158464467282), (u'181', u'275', 0.6685791983070568)])

rdd2 = sc.parallelize([(u'176', u'244'), (u'28', u'244'), (u'165', u'244'), (u'165', u'275'), (u'181', u'275'), (u'141', u'388'), (u'154', u'238')])

我的预期输出应如下所示:

[(u'176', u'244', -0.03925566875021147,1), (u'28', u'244', 0.9175106515709205,1), (u'165', u'244', -0.3837580218245722,1), (u'181', u'244', 0.29145693160561503,0), (u'161', u'244', -0.503468718448459,0), (u'28', u'275', 1.1636548589189926,0), (u'165', u'275', -1.026158464467282,1), (u'181', u'275', 0.6685791983070568,1)]

我想加入两个rdds,添加加入状态,例如1或0。

在rdd1中第一个元组为(u'176', u'244', -0.03925566875021147),并且rdd2包含 (u'176', u'244'),rdd1,rdd2的前两个元素相同,则我的预期输出为(u'176', u'244', -0.03925566875021147,1)

对于Rdd1:(u'181', u'275', 0.6685791983070568)和Rdd2:(u'181', u'275')的输出将是(u'181', u'275', 0.6685791983070568,1)

其他情况: rdd1包含(u'181', u'244', 0.29145693160561503),但rdd2不包含任何类似(u'181', u'244')的元组,因此预期输出将为(u'181', u'244', 0.29145693160561503,0)

我通过创建数据框实现了此目的,但是我不想使用数据框联接。请帮助这个如何使用rdds。

2 个答案:

答案 0 :(得分:0)

要以rdd方法执行此操作,必须将rdd与要连接的列配对,然后执行此连接和其他连接的左外部连接。对于其中的每个元素(k,v),生成的RDD要么包含其他w的所有对(k,(v,Some(w))),要么包含不存在的对(k,(v,None))其他元素的键为k。

 userRDD.leftOuterJoin(empRDD).collect {
        case (String, (firstrddvalue, None)) => (k,v,0)
        case (String, (firstrddvalue,secondrddvalue))=>(k,v,1)
      }

答案 1 :(得分:0)

  

我想加入两个rdds,添加加入状态,例如1或0

要加入rdd,您需要 pairedRdd

pairedRdd1 = rdd1.map(lambda x: ((x[0], x[1]), x[2:]))
pairedRdd2 = rdd2.map(lambda x: ((x[0], x[1]), 1))

在这里,我在1中填充了pairedRdd2,因为您的输出要求是从rdd1匹配rdd2必须有1。

然后最后,使用leftOuterJoin和一些操作来获得预期的输出

finalRdd = pairedRdd1.leftOuterJoin(pairedRdd2).map(lambda x: tuple(list(x[0]) + list(x[1][0]) + [0 if(x[1][1] == None) else 1]))
#[('161', '244', -0.503468718448459, 0),('165', '244', -0.3837580218245722, 1),('181', '244', 0.29145693160561503, 0),('165', '275', -1.026158464467282, 1),('181', '275', 0.6685791983070568, 1),('176', '244', -0.03925566875021147, 1),('28', '275', 1.1636548589189926, 0),('28', '244', 0.9175106515709205, 1)]

我希望答案会有所帮助