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

时间:2015-04-08 07:30:01

标签: scala apache-spark

在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的对,如果我为每个连接对生成一个数组,那就太浪费了......

1 个答案:

答案 0 :(得分:3)

您可以在.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()是懒惰的(我没有火花,但是在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)