如何使用pyspark在字典列表中添加元组值列表?

时间:2017-03-27 07:04:08

标签: list dictionary tuples pyspark rdd

我有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匹配。 能帮助我实现这个目标吗?

提前谢谢。

2 个答案:

答案 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]}]