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