如何向 spark/scala 的 getOrElse() 添加更多代码逻辑?

How to add more code logic to spark/scala's getOrElse()?

在 Spark rdd 的 join 函数中,我们可以像这样使用 getOrElse() 函数:

rdd_a.leftOuterJoin(rdd_b) { (id, data_a, data_b) => 
    data_b.getOrElse(0)
}

但是我想在 getOrElse 函数中添加更复杂的代码逻辑,但我不知道该怎么做。

比如我想生成一个高斯分布随机变量数组

rdd_a.leftOuterJoin(rdd_b) { (id, data_a, data_b) => 
    arr = new Array[Double](10)
    arr.map(_=>Utils.random.nextGaussian())
    data_b.getOrElse(arr)
}

但是你知道吗,leftOuterJoin 之后没有 data_b 的 pair 很少,如果我为每个 join-pair 生成一个数组,那是一种浪费...

您可以在 .getOrElse() 中构建数组:

rdd_a.leftOuterJoin(rdd_b) { (id, data_a, data_b) => 
    data_b.getOrElse{
        arr = new Array[Double](10)
        arr.map(_=>Utils.random.nextGaussian())
    }
}

Option.getOrElse() 是懒惰的(我手边没有 spark,但有一个 scala 的例子):

scala> List().headOption.getOrElse{ println("Building an array then."); Array(1) }
Building an array then.
res1: Array[Int] = Array(1)

scala> List(1).headOption.getOrElse{ println("Building an array then."); Array(1) }
res2: Any = 1

顺便说一下,您可以直接使用 .fill 创建具有特定值的 n 元素数组(而不是创建它然后映射它):

scala> Array.fill(3)(Random.nextGaussian)
res6: Array[Double] = Array(-0.2773138805049755, -1.4178827462945545, -0.8710624835785054)