spark重点:join操作之昂贵,先reduceByKey

总之,join通常是你在使用Spark时最昂贵的操作,需要在join之前应尽可能的先缩小你的数据。

假设,你有一个RDD存着(熊猫id,分数),另外一个RDD存着(熊猫id,邮箱地址)。若你想给每只可爱的熊猫的邮箱发送她所得的最高的分数,你可以将RDD根据id进行join,然后计算最高的分数,如下:

def joinScoresWithAddress1( scoreRDD : RDD[(Long, Double)],
addressRDD : RDD[(Long, String )]) : RDD[(Long, (Double, String))]= {
    val joinedRDD = scoreRDD.join(addressRDD)
    joinedRDD.reduceByKey( (x, y) => if(x._1 > y._1) x else y )
}
  • 1
  • 2
  • 3
  • 4
  • 5

然而,这可能不会比先减少分数数据的方案快。先计算最高的分数,那么每个熊猫的分数数据就只有一行,接下来再join地址数据:

def joinScoresWithAddress2( scoreRDD : RDD[(Long, Double)],
addressRDD : RDD[(Long, String )]) : RDD[(Long, (Double, String))]= {
    val bestScoreData = scoreRDD.reduceByKey((x, y) => if(x > y) x else y)
    bestScoreData.join(addressRDD)
}
  • 1
  • 2
  • 3
  • 4
  • 5

若每个熊猫有1000个不同的分数,那么这种做法的shuffle量就比上一种的小了1000倍。

猜你喜欢

转载自blog.csdn.net/seareal1/article/details/80326834
今日推荐