Spark Scala:RDD元素之间的距离

时间:2016-02-17 10:55:22

标签: scala apache-spark

我有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到数十亿。

请帮助我。

2 个答案:

答案 0 :(得分:2)

您要找的是Cartesian Product。这为您提供RDD1RDD2的每个元素之间的产品(或配对)。

由于您正在处理数十亿大小的数据集,请确保您的基础架构支持它。

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)