减少火花时保存列(Scala)

时间:2017-03-18 23:02:14

标签: scala apache-spark

我在(city, person_id, number)上有一个RDD,我希望找到每个城市中数量最多的人。我的第一个想法是使用reduceByKey将city作为键,使用number作为值(rdd.reduce((num1, num2) => Math.max(num1, num2))),但我不知道如何将person_id保留在进程中。

1 个答案:

答案 0 :(得分:0)

您需要将您的RDD转换为PairRdd,然后您可以reduceByKey并保留最大数量的人

rdd.map { case (city, person_id, number) => (city, (person_id, number)) }.
      reduceByKey {
        case ((person_id1, n1), (person_id2, n2)) =>
          if (n1 > n2)
            (person_id1, n1)
          else
            (person_id2, n2)
      }.map {
      case (city, (person_id, number)) => (city, person_id)
    }