如何将总和和最大日期结合在一起

时间:2015-09-23 01:46:01

标签: apache-spark rdd

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

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是否提供合适的日期或时间格式。

2 个答案:

答案 0 :(得分:2)

无需加入。您可以使用简单的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))

答案 1 :(得分:1)

您可以跳过最终加入,并使用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)值元组。