在Apache Spark中,如何通过两个共享值对RDD的所有行进行分组?

时间:2016-08-07 17:26:33

标签: scala apache-spark cassandra rdd

我有一个自定义案例对象的RDD,格式为

{userId:"h245hv45uh", title: "The-BFG", seen: 1, timestamp: 2016-08-06 13:19:53.051000+0000}

有没有什么方法可以对具有相同userId和title的所有行进行分组,然后在新的RDD中创建一个具有相同userId和title但却添加了所有'see'值的行?

{userId:"h245hv45uh", title: "The-BFG", seen: 71, timestamp: 2016-08-06 13:19:53.051000+0000}
像那样^如果有71行具有相同的userId和title?

原始RDD有几个标题和用户ID,我正在尝试聚合分数,过滤匹配的userIds和标题

由于

1 个答案:

答案 0 :(得分:2)

您可以尝试将其转换为配对RDD,然后使用reduceByKey

def combFunc(cc1: CaseClass, cc2: CaseClass): CaseClass = {
  cc1.copy(seen = cc1.seen + cc2.seen)
}

val newRDD = rdd
  .map( i => ((i.userId, i.title), i) ) // converting into a PairRDD
  .reduceByKey(combFunc) // reducing by key
  .values // converting back to an RDD[CaseClass]