我有2个时间序列的RRD。像
rdd1.take(5)
[(1, 25.0)
(2, 50.23)
(3, 65.0)
(4, 7.23)
(5, 12.0)]
和
rdd2.take(5)
[(1, 85.0)
(2, 3.23)
(3, 9.0)
(4, 23.23)
(5, 65.0)]
我想找到第一个rdd的每个元素与第二个rdd的每个元素之间的不一致并获得下一个
result.take(5)
[((1,1): (25.0-85.0)**2),
((1,2): (25.0 - 3.23)**2),
.....
((1,5): (25.0 - 65.23)**2),
.....
((2,1): (50.23 - 85.0)**2),
.....
((5,5): (12.0 - 65.0)**2),
]
元素的数量可以从10 000到数十亿。
请帮助我。
答案 0 :(得分:2)
您要找的是Cartesian Product
。这为您提供RDD1
与RDD2
的每个元素之间的产品(或配对)。
由于您正在处理数十亿大小的数据集,请确保您的基础架构支持它。
similar question
可能会对您有所帮助。
答案 1 :(得分:2)
@Mohit是对的,你正在寻找两个RDD的笛卡尔积,那么你应该映射并计算你的距离。
以下是一个例子:
val rdd1 = sc.parallelize(List((1, 25.0), (2, 50.23), (3, 65.0), (4, 7.23), (5, 12.0)))
val rdd2 = sc.parallelize(List((1, 85.0), (2, 3.23), (3, 9.0), (4, 23.23), (5, 65.0)))
val result = rdd1.cartesian(rdd2).map {
case ((a,b),(c,d)) => ((a,c),math.pow((b - d),2))
}
现在,让我们看看它的样子:
result.take(10).foreach(println)
# ((1,1),3600.0)
# ((1,2),473.93289999999996)
# ((1,3),256.0)
# ((1,4),3.1328999999999985)
# ((1,5),1600.0)
# ((2,1),1208.9529000000002)
# ((2,2),2209.0)
# ((2,3),1699.9128999999998)
# ((2,4),728.9999999999998)
# ((2,5),218.1529000000001)