如何向 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)
在 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)