Python 合并键不相同但相关的两个RDD
在pyspark中,考虑到以下两种RDD:Python 合并键不相同但相关的两个RDD,python,apache-spark,join,rdd,Python,Apache Spark,Join,Rdd,在pyspark中,考虑到以下两种RDD: rrd1=[('my name',5),('name is',4)] 及 rdd2=[('my',6),('name',10),('is',5)] 其中rdd1是bigram和counts的元组,rdd2是对应的unigram和counts的元组, 我想要一个包含3个元素的元组的RDD,如: RDD=[('my name',5),('my',6),('name',10)),('name is',4),('name',10),('is',5))] 我尝试
rrd1=[('my name',5),('name is',4)]
及
rdd2=[('my',6),('name',10),('is',5)]
其中rdd1是bigram和counts的元组,rdd2是对应的unigram和counts的元组,
我想要一个包含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)
,但在这种情况下,这不是正确的方法,因为键不同,但在某种意义上它们是相关的您可以这样做;拆分bigram rdd以生成一个键与rdd2
连接,然后按bigram分组以将属于同一个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))]
您使用的是python还是scala?您标记了python,但您的代码是scala?我使用的是python,示例只是以元组列表的形式显示rdd。我不认识斯卡拉!有没有什么方法可以保持顺序,比如在第二个元组中,('name',10)和('my',6)的顺序与二元组中的'my name'不一样我想有一些类似于
[('name Is',4),('name',10),('Is',5)),('my name',5),('my',6),('name',10)]