我遇到了一个问题,我不确定如何以优雅的方式接近。我有2个RDD需要加入:
First - RDD[(Int, Double)]
Second - RDD[MyObject, List[(Int, Double)])
我需要使用Int
作为键加入这两个RDD。使用第一个RDD很清楚 - 我可以使用keyBy
定义Int
但是如何在第二个RDD中定义keyBy
?我的RDD必须具有以下结构
RDD[MyObject, Int, Double]
其中Double
是Double
加入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个嵌套循环来寻求更优雅的解决方案来解决这个问题。
答案 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)
}