我在下面创建了2个Rdd
{
"id": "c2dec94f",
"data": [
{
"field_template_id": 1,
"value": "111"
},
{
"field_template_id": 2,
"value": [
222, 444
]
},
{
"field_template_id": 3,
"value": [
333
]
}
]
}
现在,我想将rd2的两个rdd重复计数中的共同元素作为新rd4中的值进行计数,即
rd2=sc.parallelize([['A', 'B','D'], ['B', 'C'], ['A', 'B'],['B']])
rd3=sc.parallelize([['A', 'B'],['B', 'C'],['B','D']])
rd2.collect()
[['A', 'B','D'], ['B', 'C'], ['A', 'B'],['B']]
rd3.collect()
[['A', 'B'], ['B', 'C'],['B','D']]
在两个rdd中都很常见,但在rd2中的重复计数为2。
我期望的rd4是:
['A', 'B']
答案 0 :(得分:0)
您可以在rdd上使用countByKey
检查重复计数,它将返回一个defaultdict
。
但是您说过希望将结果设为rdd
,因此可以改用reduceByKey
函数。
我将创建与您相同的rdd
rd2=sc.parallelize([['A', 'B'], ['B', 'C'], ['A', 'B'],['B']])
rd2.map(lambda x: (tuple(x),1)).reduceByKey(lambda x,y: x+y).collect()
[(('B',), 1), (('A', 'B'), 2), (('B', 'C'), 1)]
现在您将rdd输出为(tuple,count)
结构,可以通过map
函数将其更改为列表。
rd2.map(lambda x: (tuple(x),1)).reduceByKey(lambda x,y: x+y).map(lambda x: (list(x[0]),x[1])).collect()
[(['B'], 1), (['A', 'B'], 2), (['B', 'C'], 1)]
我希望这能解决您的问题。