我有2个rdd,一个作为字典列表,第二个作为元组列表如下所示 -
rdd1 = [{'id1',['string','string',count]},{'id2',['string','string',count]},{'id3',['string ','string',count]}] rdd2 = [(id1,count),(id2,count),(id3,count)]
现在我想将rdd2中的count添加到rdd1,如果rdd2中的id与rdd1匹配。 能帮助我实现这个目标吗?
提前谢谢。
答案 0 :(得分:2)
虽然盖茨的答案是正确的,但在使用RDD时,应尽量避免使用for循环。 RDD的操作是并行化的,与使用大数据集时的for循环相比要快得多。您可以通过连接两个RDD并重新格式化输出来实现相同的目标:
rdd1 = sc.parallelize([{'id1':['string','string',1]}, {'id2':['string','string',2]}, {'id3':['string','string',3]}])
rdd2 = sc.parallelize([('id1',2), ('id2',4), ('id3',6), ('id4',8)])
rdd_joined = rdd1.flatMap(lambda x:x.items()).join(rdd2)
rdd_reformatted = rdd_joined.map(lambda (x,(y,z)):{x:y[:-1]+[y[-1]+z]})
rdd_reformatted.collect()
作为输出:
[{'id2': ['string', 'string', 6]},
{'id3': ['string', 'string', 9]},
{'id1': ['string', 'string', 3]}]
答案 1 :(得分:0)
我希望这会有所帮助。
rdd1 = [{'id1':['string','string',1]}, {'id2':['string','string',2]}, {'id3':['string','string',3]}]
rdd2 = [('id1',2), ('id2',4), ('id3',6), ('id4',8)]
for each in rdd2:
there = False
position = 0
for ele in rdd1:
if each[0] in ele.keys():
#now increment the count
original = rdd1[position]
originalList = original[each[0]]
#updating the 3rd element
newList = originalList
newList[2] = originalList[2] + each[1]
#update the new list to key
updated = { each[0] : newList }
rdd1[position] = updated
there = True
break
position = position + 1
print rdd1
#output: [{'id1': ['string', 'string', 3]}, {'id2': ['string', 'string', 6]}, {'id3': ['string', 'string', 9]}]