在运行Apache Spark作业时,我遇到的一个问题是将RDD中的每个元素相互叠加。 简单地说,我想做类似的事情,
目前,我使用2个迭代器为每个' foreach'做这个。我的直觉是,这可以以一种非常有效的方式完成。
for (elementOutSide <- iteratorA) {
for (elementInside <- iteratorB) {
if (!elementOutSide.get(3).equals(elementInside.get(3))) {
val multemp = elementInside.getLong(3) * elementOutSide.getLong(3)
....
...
}}}
任何人都可以帮助我纠正和改善情况吗?在此先感谢.. !!
答案 0 :(得分:2)
正如评论所指出的,这是一个笛卡尔联盟。以下是RDD[(Int, String)]
的完成方式,我们对每两个不相同的Int
的乘法感兴趣:
val rdd: RDD[(Int, String)] = sc.parallelize(Seq(
(1, "aa"),
(2, "ab"),
(3, "ac")
))
// use "cartesian", then "collect" to map only relevant results
val result: RDD[Int] = rdd.cartesian(rdd).collect {
case ((t1: Int, _), (t2: Int, _)) if t1 != t2 => t1 * t2
}
注意:此实现假定输入记录是唯一的,如指示的那样。如果它们不是,则可以在比较索引而不是值时执行笛卡尔连接和rdd.zipWithIndex
结果的映射。