将Spark RDD中的元素相互叠加

时间:2017-09-05 18:05:44

标签: scala apache-spark iterator apache-spark-sql query-optimization

在运行Apache Spark作业时,我遇到的一个问题是将RDD中的每个元素相互叠加。 简单地说,我想做类似的事情,

enter image description here

目前,我使用2个迭代器为每个' foreach'做这个。我的直觉是,这可以以一种非常有效的方式完成。

for (elementOutSide <- iteratorA) {
  for (elementInside <- iteratorB) {
    if (!elementOutSide.get(3).equals(elementInside.get(3))) {
      val multemp = elementInside.getLong(3) * elementOutSide.getLong(3)
      ....
      ...

}}}

任何人都可以帮助我纠正和改善情况吗?在此先感谢.. !!

1 个答案:

答案 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结果的映射。