在pyspark,考虑两个rdds,如:
rrd1 = [('my name',5),('name is',4)]
和
rdd2 = [('my',6),('name',10),('is',5)]
其中rdd1是bigrams和count的元组,rdd2是相应的unigram和count的元组, 我想要一个包含3个元素的元组的RDD,如:
RDD = [ (('my name',5),('my',6),('name',10)) , (('name is',4), ('name',10),('is',5)) ]
我尝试了rdd2.union(rdd1).reduceByKey(lambda x,y : x+y)
,但在这种情况下,这不是正确的方法,因为键不同,但 在某种意义上它们是相关的。
答案 0 :(得分:1)
你可以这样做;拆分 bigram rdd以生成一个与rdd2
连接的密钥,然后由bigram分组以收集属于同一个二元组的元素:
(rdd1.flatMap(lambda x: [(w, x) for w in x[0].split()])
.join(rdd2.map(lambda x: (x[0], x)))
.map(lambda x: x[1])
.groupBy(lambda x: x[0])
.map(lambda kv: (kv[0],) + tuple(v[1] for v in kv[1]))
.collect())
# [(('name is', 4), ('name', 10), ('is', 5)), (('my name', 5), ('name', 10), ('my', 6))]