从两个基于rds在pyspark中的第一个rdd的重复计数创建对rdd?

时间:2018-12-05 02:35:32

标签: python apache-spark dataframe pyspark rdd

我在下面创建了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']

1 个答案:

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

我希望这能解决您的问题。