Spark / Scala - 使用keyBy和List [(Int,Double)]的RDD]

时间:2016-05-02 17:46:29

标签: list scala join apache-spark rdd

我遇到了一个问题,我不确定如何以优雅的方式接近。我有2个RDD需要加入:

First - RDD[(Int, Double)]
Second - RDD[MyObject, List[(Int, Double)])

我需要使用Int作为键加入这两个RDD。使用第一个RDD很清楚 - 我可以使用keyBy定义Int但是如何在第二个RDD中定义keyBy?我的RDD必须具有以下结构 RDD[MyObject, Int, Double]其中DoubleDouble加入Int key之后乘以2 var logo1 = "https://ac3d197e9505f18c50e0-32b9f49f48b2c22be12b40ee79e2acc4.ssl.cf1.rackcdn.com/icon/logos_and_badges_thumbs_up/7x5uDqD4GBTrCSbXggZ-/58C79CAE-C3E6-4D6A-BAF5-A03631274FD7.png"; var logo2 = "https://www.facebookbrand.com/img/assets/asset.f.logo.lg.png"; var images = new Array (logo1, logo2); var index = 1; var onHovering = false; function rotateImage() { if (onHovering) { return; // prevent fading while hovering... } $('.logoimage').fadeOut('slow', function() { $(this).attr('src', images[index]); $(this).fadeIn('fast', function() { if (index == images.length-1) { index = 0; } else { index++; } }); }); } $(function () { setInterval (rotateImage, 1000); $('.logoimage').hover(function() { onHovering = true; $(this).attr('src', images[0]); }, function() { onHovering = false; $(this).attr('src', images[1]); }); });的结果。 我知道我可以通过使用2个嵌套循环来寻求更优雅的解决方案来解决这个问题。

1 个答案:

答案 0 :(得分:3)

使用flatMap

val first: RDD[(Int, Double)] = // ...
val second: RDD[T, List[(Int, Double)]) = // ...

val flattened: RDD[(Int, (T, Double))] = second.flatMap { case (t, list) => 
  list.map { case (i, d) => (i, (t, d)) } 
}

val joined: RDD[(Int, (Double, (T, Double)))] = first.join(flattened)
val multiplied: RDD[(T, Int, Double)] = joined.map { case (i, (d1, (t, d2))) => 
  (t, i, d1 * d2)
}