我正在处理这样的表格:
我的解决方案是使用
问题在于代码中有2个洗牌阶段,一个在reduceByKey中,另一个在leftOuterJoin中,但如果我用Hadoop MapReduce编写代码,则可以在只有1个洗牌阶段的情况下轻松获得相同结果(在reduce阶段多次使用outputer.collect函数)。 因此,我想知道是否有更好的方法可以只进行一次洗牌。欢迎提出任何建议。
我正在处理这样的表格:
ID f1
001 1
001 2
001 3
002 0
002 7
我希望计算相同ID下f1列的总和,并创建一个新的列来存储该总和,即:
ID f1 sum_f1
001 1 6
001 2 6
001 3 6
002 0 7
002 7 7
我的解决方案是使用
reduceByKey
计算总和,然后将结果与原始表连接:val table = sc.parallelize(Seq(("001",1),("001",2),("001",3),("002",0),("002",7)))
val sum = table.reduceByKey(_ + _)
val result = table.leftOuterJoin(sum).map{ case (a,(b,c)) => (a, b, c.getOrElse(-1) )}
我得到了正确的结果:
result.collect.foreach(println)
输出:
(002,0,7)
(002,7,7)
(001,1,6)
(001,2,6)
(001,3,6)
问题在于代码中有2个洗牌阶段,一个在reduceByKey中,另一个在leftOuterJoin中,但如果我用Hadoop MapReduce编写代码,则可以在只有1个洗牌阶段的情况下轻松获得相同结果(在reduce阶段多次使用outputer.collect函数)。 因此,我想知道是否有更好的方法可以只进行一次洗牌。欢迎提出任何建议。