spark 如何将总和计数和最大日期放在一起

how does spark to get the sum count and max date together

例如,我有以下列的记录: (国家、城市、日期、收入)

USA SF 2015-01 80
USA SF 2015-03 60
USA NY 2015-02 30

我需要按国家和城市分组,然后得到最大日期和收入总和。 我尝试使用两个聚合和一个连接来完成需求,例如:

val groupDateRdd = rawRdd.map(tp=>((tp._1,tp._2),tp._3)).reduceByKey(max())
val groupSumRdd = rawRdd.map(tp=>((tp._1,tp._2),tp._4)).reduceByKey(sum())
val resRdd = groupDateRdd.join(groupSumRdd)

请问这样可以吗,或者其他更好的解决方案,我有一个问题,我应该如何获得最大日期,Spark 是否提供合适的日期或时间格式。

您可以跳过最终连接并使用 combineByKey() 执行以下操作:

val resRDD = rawRDD.map { case (country, city, date, inc) =>
  ((country, city), (date, inc))
}.combineByKey(
  (date: String, inc: Double) => (date, inc),
  (acc: (String, Double), (date: String, inc: Double)) => (maxDate(date, acc._1), inc + acc._2),
  (acc1: (String, Double), acc2: (String, Double)) => (maxDate(acc._1, acc._2), acc._1 + acc._2)
)

你显然必须根据你的日期格式实现你自己的 maxDate() 版本,但这应该为每个国家/城市对生成一个 (maxDate, summedIncome) 值元组。

无需加入。你可以用一个简单的 reduceByKey 来做到这一点:

val result = rawRdd.map(tp => ((tp._1,tp._2),(tp._3, tp._4)))
                   .reduceByKey((v1, v2) => (maxDate(v1._1, v2._1), v1._2 + v2._2))

输出将如下所示:

((USA,NY),(2015-02,30))
((USA,SF),(2015-03,140))