Spark中复杂的reduceByKey操作来计算多个aggr。 fields + count dist

时间:2015-10-16 15:11:02

标签: count apache-spark reduce

我有这个RDD(id,(a,b,c)),其中c是一个可以为不同的id重复的字符串。也可以重复id。 现在,我需要按id聚合,聚合将是" 总和(a)中, 总和(b)中 数不同(c)。

我正在考虑使用reduceByKey,我知道如何使用sum部分,但不知道如何处理计数不同

理想情况下,我想的是:

RDD.reduceByKey((x,y)=> (x._1 + y._1, x._2 + y._2, countDistinct(x._3, y._3)))

有什么想法吗?非常感谢!

*更新(1)* 我现在能做的最好的事情是:

RDD.reduceByKey((x,y)=> (x._1 + y._1, x._2 + y._2, (x._3 + "," + y._3))).map(row => row._1, row._2._1, row._2._2, row._2._3.split(",").distinct.length

1 个答案:

答案 0 :(得分:0)

我现在能想到的最好的就是使用一套中间套装,然后检查它的尺寸。我想如果有办法在一种方法中做到这一点

RDD.aggregateByKey((0,0,Set[Int]()))(
  (x,y) => (x._1 + y._1, x._2 + y._2, x._3 + y._3),
  (x,y) => (x._1 + y._1, x._2 + y._2, x._3 ++ y._3)
).mapValues(x => (x._1, x._2, x._3.size))