例如,我的列有以下记录: (国家,城市,日期,收入)
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是否提供合适的日期或时间格式。
答案 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)
值元组。